2017-03-28 11 views
1

私はアイテムのリストを表示する画面を持っています。Android、java rx、非同期

  • まず、ローカルデータベースから要素を表示します。
  • ユーザーは、インターネットをチェックし、地元の要素を表示し、 された後(デバイスがインターネットを持っている場合)、それらを更新してください。

私はその後、私は、次の

mSubscriptions.clear(); 
Subscription subscription = fetchData 
     .subscribeOn(mSchedulerProvider.computation()) 
     .observeOn(mSchedulerProvider.ui()) 
     .subscribe(
       new Subscriber<List<Data>>() { 
        @Override 
        public void onCompleted() { 
         view.setLoadingIndicator(false); 
        } 

        @Override 
        public void onError(Throwable e) { 
         processError(e); 
        } 

        @Override 
        public void onNext(List<Data> data) { 
         processData(data); 
        } 
       } 

     ); 
mSubscriptions.add(subscription); 

をやって、次のコードの断片に

Observable<Data> fetchFromdisk = ...; 
Observable<Data> fetchFromNetwork = ...; 

Observable<Data> fetchData= Observable.concat (fetchFromdisk ,fetchFromNetwork); 

を持っていますが、何が起こっていることfetchFromdiskが、その後FetchFromNetworkが実行され、最初の実行であるということです。放出要素が終了すると、ProcessDataの実行が開始されます。

私が達成したいものの全く逆です。 データをすばやく表示してからインターネットにアクセスするようにユーザーの優先順位を設定したいと考えています。 私は何が間違っていますか?

+0

サイドポイント、あなたは、私はすでに試した 'Schedulers.io()' – Sourabh

+0

@Sourabhを使用する必要がありますが、それはどちらか – user60108

+0

いいえ、サイドポイントを動作しませんでした、私は、あなたの問題への解決策を言っていないですしかし、あなたはIOを使用する必要がありますとにかく – Sourabh

答えて

0

あなたがメソッドを呼び出すことができ、キャッシュが抽出された後、あなたのコードを実行する.doOnCompleted。

mSubscriptions.clear(); 
Subscription subscription = fetchData 
    .subscribeOn(mSchedulerProvider.computation()) 
    .doOnCompleted(new Action0<List<Notification>>() { 
       @Override 
       public void call(List<Data> cachedData) { 
         // Get data from server here. 

         // Compare new data against cached data. 

         // Update cache. 

         // Process new data. 
       } 
      }) 
    .observeOn(mSchedulerProvider.ui()) 
    .subscribe(
      new Subscriber<List<Data>>() { 
       @Override 
       public void onCompleted() { 
        view.setLoadingIndicator(false); 
       } 

       @Override 
       public void onError(Throwable e) { 
        processError(e); 
       } 

       @Override 
       public void onNext(List<Data> data) { 
        processData(data); 
       } 
      } 

    ); 
    mSubscriptions.add(subscription); 

/////////非ソリューションヒント

が観察するのではなく、シングルを使用してみてください////////、それはonCompletedを取り除くことができます。 https://github.com/lettuce-io/lettuce-core/issues/139

0

あなたの加入者は、データではなく、リストを返すので、それはあるかもしれませんか?

はあなたが右のオブザーバを使用していますか?連結演算子は、同じ要素を持つオブザーバを返す必要があります。

Observable<String> a = Observable.just("a"); 
    Observable<String> b = Observable.just("b"); 

    Observable<String> ab = Observable.concat(a,b); 

    ab.subscribe(new Subscriber<String>() { 
     @Override 
     public void onCompleted() { 

     } 

     @Override 
     public void onError(Throwable e) { 

     } 

     @Override 
     public void onNext(String s) { 
      Log.d("onNext", s); 
     } 
    }); 
関連する問題