2016-04-06 12 views
0

私はapiまたはデータベースからいくつかのデータを返す小さなコードサンプルを持っています。サブスクリプションのメソッドの戻り値をベースにするにはどうすればよいですか?

ここで、ネットワークステータスに基づいて別の条件を追加します。これは私が試したものです、私はこのためにReactiveNetworkライブラリを使用するが、私はそれを動作させることはできません。

@Override public Observable<List<Tactic>> getTactics(boolean forceRefresh) { 

    Observable<List<Tactic>> diskObservable = 
     disk.get().getTactics().compose(RxDataUtils.applyLog(SourceType.DISK)); 

    Observable<List<Tactic>> apiObservable = api.get() 
     .getTactics() 
     .doOnNext(tactics -> disk.get().save(tactics)) 
     .compose(RxDataUtils.applyLog(SourceType.API)); 

    Subscription connectivityStatusSubscription = new ReactiveNetwork().observeConnectivity(context) 
     .compose(RxUtils.applyStandardSchedulers()) 
     .subscribe(connectivityStatus -> { 
      isNetworkAvailable = RxDataUtils.isConnected(connectivityStatus); 
      Timber.v("ConnectivityChanged: " + isNetworkAvailable); 
     }); 

    if (isNetworkAvailable) return forceRefresh ? 
     apiObservable : Observable.concat(diskObservable, apiObservable).first(
     tactics -> (tactics != null && tactics.size() > 0)); 
    return diskObservable; 
    } 

それはあなたが他の人とステータスのストリームを組み合わせるべきであるすべての

答えて

2

で何かを記録しませんでした2つの個別のサブスクリプションを作成しないでください。それ以外の場合は、ネットワーク接続に実際には反応しません。

おそらく使用したいのはswitchMapです。ネットワーク接続が変わるたびに、使用しているストリームを更新できます。広範なストロークで

、それはこのような何かを行くだろう:

connectivityObservable.switchMap(isConnected -> { 
    if (isConnected) { 
    return networkObservable; 
    } 
    return diskObservable; 
} 

(あなたは少し複雑、私はちょうどここに一般的なアイデアをレイアウトしたいだろうように見えます。)

関連する問題