2017-03-28 71 views
1

我有一個顯示項目列表的屏幕。Android,java rx,異步

  • 首先,我想顯示來自本地數據庫的元素。
  • 用戶查看本地元素後,檢查互聯網並更新它們(如果設備具有互聯網)。

我有下面的代碼片段

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

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

然後我做了以下

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); 

但正在發生的事情是,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

這可能是因爲您的訂閱者返回一個List而不是Data?

您確定您使用的是正確的觀察者嗎? concat操作符應該返回具有相同元素的Observer。

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); 
     } 
    });