2017-09-05 26 views
1

我在努力研究如何從數據層向視圖層提出網絡錯誤。在Retrofit + RxJava2 +房間處理網絡錯誤

我正在使用Room以及RxJava2和Retrofit2。我以本地優先的方式實現存儲庫模式,所以我查詢本地數據,同時從遠程獲取數據,並在必要時更新本地數據。在代碼中,這將是:

public Flowable<List<DEvent>> getAll() { 
    return db.dEventDataStore().getAll() 
     .doOnSubscribe(new Consumer<Subscription>() { 
      @Override 
      public void accept(final Subscription subscription) throws Exception { 
       dEventApi.getAll().subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()) 
        .subscribe(new MaybeObserver<List<DEvent>>() { 
         @Override 
         public void onSubscribe(@NonNull Disposable disposable) { 
          Timber.d("Remote onSubscribe"); 
         } 

         @Override 
         public void onSuccess(@NonNull List<DEvent> dEvents) { 
          Timber.d("Remote onSuccess!"); 
          db.dEventDataStore().insertAll(dEvents); 
         } 

         @Override 
         public void onError(@NonNull Throwable throwable) { 
          Timber.d("Remote onError!"); 
         } 

         @Override 
         public void onComplete() { 
          Timber.d("Remote onComplete!"); 
         } 
        } 
       ); 
      } 
     }); 
} 

並在視圖層:

mDisposable.add(repo.getAll() 
      .subscribeOn(Schedulers.io()) 
      .observeOn(AndroidSchedulers.mainThread()) 
      .subscribe(new Consumer<List<DEvent>>() { 
       @Override 
       public void accept(List<DEvent> dEvents) throws Exception { 
        Timber.d("OnNext!!"); 
        mView.showEvents(dEvents); 
       } 
      }, new Consumer<Throwable>() { 
       @Override 
       public void accept(Throwable throwable) throws Exception { 
        Timber.e("Error on getting DEvents - " + Log.getStackTraceString(throwable)); 
       } 
      })); 

我怎麼能發射出拋出?

回答

1

您不在這裏鏈接這些觀察對象 - 因此來自API Observable的錯誤不會傳播到視圖層。 (而且我不知道房間是如何運作的,但你會查詢兩次爲DB更新)如果我理解正確

db.dEventDataStore().getAll()創建由房所以這Flowable是無限的,聽DB變化併發出任何變化。所以你想查詢服務器,並在數據更新數據庫的情況下,並期望從房間的DB流動排放。

在這種情況下,您可以使用merge和API Maybe以並行方式執行此操作,忽略它發出的任何元素只傳遞錯誤。通過這種方式,下游我們將僅從數據庫DB獲得數據發射,同時仍然收到服務器錯誤通知。

public Flowable<List<DEvent>> getAll() { 
    return Flowable.merge(
      db.dEventDataStore().getAll(), 
      dEventApi.getAll() 
        .doAfterSuccess(dEvents -> db.dEventDataStore().insertAll(dEvents)) 
        .ignoreElement() 
        .toFlowable() 
    ); 
} 
+0

謝謝!按預期工作,使xxxAPIDataSource(翻新)返回Flowable – webo80