2017-12-12 29 views
0

私のアプリケーションでは、アプリケーションが起動するとすぐに大量のデータをロードする必要があります。また、一部のフラグメント/アクティビティでデータがロードされたときにイベントを受け取る必要があります。ConnectableObservableを使用してプリフェッチし、別のサブスクライバで処理されたデータを使用する方法

私はその目的のためにRxJava ConnectableObservableを使用しています。私はreplay()を使用しました。私は複数の加入者に同じデータが必要です。

Psudoコード:今、私はデータを事前に取得したい場合は

Observable.create(emitter -> { 
      try { 
       Data next = getDataFromDb(); 
       emitter.onNext(next); 
       emitter.onCompleted(); 
      } catch (SQLiteException e) { 
       emitter.onError(e); 
      } 
     }, Emitter.BackpressureMode.BUFFER) 
     .toList() 
     .compose(applySchedulers()) 
     .replay() 

、Iアプリケーションクラスでsubscribe、その後の活動では、/フラグメントはconnect()を使用する必要がありますか?

答えて

2

これを試してみてくださいということ

observable = Observable.create(emitter -> { 
     try { 
      Data next = getDataFromDb(); 
      emitter.onNext(next); 
     } catch (SQLiteException e) { 
      emitter.onError(e); 
     } 
    }, Emitter.BackpressureMode.BUFFER) 
    .toList() 
    .compose(applySchedulers()) 
    .replay(1) 
    .autoConnect() 
//start your prefetch 
observable.subscribe()//you should better add some log to see the process 

//In your Activity 
observable.subscribe(/**Your Subscribe**/)// here you will get the replayed value 

注意:あなたが観察可能の同じインスタンスを維持する必要があり

  1. 、そうでないあなたは、あなたがしなければならないあなたのリプレイ値

  2. を取得することはできませんautoConnect()の他のオーバーロード、例えばautoConnect(int numberOfSubscribers, @NonNull Consumer<? super Disposable> connection)を使用し、アップストリームソースの使い捨て(RxJava 1.xのSubscription)を入手してください。