2016-03-23 11 views
1

私のシナリオはこのイメージに非常に似ています。アプリのRxJavaとRxAndroidの組み合わせですか?

enter image description here

フローは次のようになります。

  1. ビューが更新されますする必要があります。
  2. RxAndroidを使用してオブザーバブルを作成し、キャッシュ/ローカルファイルからデータをフェッチします。
  3. ビューを更新します。
  4. RetrofitRxJavaを使用して別のネットワーク呼び出しを行い、Webサービスからの新しいデータで再度ビューを更新します。
  5. ローカルファイルを新しいデータで更新します。

だから、私は(Webサービスを介してローカルファイルからOneとその直後)を2回ビューを更新しています

どのように私はRxJavaRxAndroidを使用して結果を達成することができますか?私が考えていたのは

  1. ローカルファイルシステムからデータを取得するためにobservable1を作成します。
  2. の方法では、observable1の方法で別のobservable2を作成することができます。
  3. observable2.onNext()ローカルファイルを更新できます。 viewは更新されたデータ(ファイルに読み込まれています)でどのように更新されますか?

どのような良いアプローチですか?

+0

FYI RXAndroidは廃止され、そのfuntionalityはobservable1発光が何であるかをRXBindings –

+0

に圧延しましたか? –

答えて

3

であなたのビューを更新。私は「5」を解決するためにあなたのポイント「2」を対処する(sockeqweにより示唆されるように)merge演算子を使用して「4」を並列に、かつdoOnNext:私のブログの記事で

// NetworkRepository.java 
public Observable<Data> getData() { 
    // implementation 
} 

// DiskRepository.java 
public Observable<Data> getData() { 
    // implementation 
} 

// DiskRepository.java 
public void saveData(Data data) { 
    // implementation 
} 

// DomainService.java 
public Observable<Data> getMergedData() { 
    return Observable.merge(
    diskRepository.getData().subscribeOn(Schedulers.io()), 
    networkRepository.getData() 
     .doOnNext(new Action1<Data>() { 
     @Override 
     public void call(Data data) { 
      diskRepository.saveData(data); // <-- save to cache 
     } 
     }).subscribeOn(Schedulers.io()) 
); 
} 

私はさらにfilterTimestampを使用しましたデータが同じか、キャッシュが空の場合(これは指定していませんが、この問題も同様に起こります)、UIの更新はスキップしてください。ポストへ

リンク:https://medium.com/@murki/chaining-multiple-sources-with-rxjava-20eb6850e5d9

0

concatまたはmergeオペレータはあなたが

のためにそれらの違いを探しているものであるように見えるです:

マージは、マージされた観測(同様のオペレータ、連結方式のことで放出されたアイテムをんインターリーブしますアイテムをインターリーブするのではなく、次のソースObservableからアイテムを放出し始める前に、各Observableのアイテムのすべてを順番に放出します。

Observable retroFitBackendObservable = retrofitBackend.getFoo().doOnNext(save_it_into_local_file); 
Observable mergedObservable = Observable.merge(cacheObservable, retroFitBackendObservable); 
mergedObservable.subscribe(...); 

それから私は、まさにこの同じシナリオに関するブログ記事を書いたmergedObservableに加入してonNext()

関連する問題