2017-09-05 74 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