Rxjava Android网络通话后保存到数据库?

时间:2017-04-15 04:04:36

标签: rx-java mvp rx-android

我正在Android上学习rxjava,并希望完成从互联网上获取数据的任务,显示查看并将其保存到数据库。

从互联网上获取数据后,我想并行,

  • 将获取的数据显示到视图
  • 保存到数据库(在计算线程上)

此外,

  • 如果网络提取成功,则显示以查看+保存到数据库(并行)
  • 如果网络提取失败,则跳过整个过程(onError())
  • 如果保存到数据库失败,请忽略并继续显示到View。

我的问题是,如果数据库部分失败,视图上不会显示任何内容。

 @Override
  public Observable<List<NearByPlacesDetail>> getNearbyTouristSpotsList(String latlng) {
    Observable<NearByPlacesMain> nearByPlacesMainObservable = googleMapApi.getTouristAttractions(latlng);

return nearByPlacesMainObservable
  .map(NearByPlacesMain::getResults)
  .onExceptionResumeNext(new Observable<List<NearByPlacesDetail>>() {
    @Override
    protected void subscribeActual(Observer<? super List<NearByPlacesDetail>> observer) {
      Throwable throwable = new Throwable("Network fetch error");
      Timber.e(throwable, "Error fetching data from internet.");
      observer.onError(throwable);
    }
  })
  .observeOn(Schedulers.computation())
  .doOnNext(nearByPlacesDetails -> {
    databaseManager.getDatabase().delete(); // Force failure
    databaseManager.savePlacesList(nearByPlacesDetails);
  })
  .onExceptionResumeNext(new Observable<List<NearByPlacesDetail>>() {
    @Override
    protected void subscribeActual(Observer<? super List<NearByPlacesDetail>> observer) {
      Timber.e("Error saving to database.");
      observer.onComplete();
    }
  });

演示

getPlacesList.execute(new PlacesListObserver(), GetPlacesListUseCase.Params.forLocation(lat, lng));

Base UseCase(域模块)

  public void execute(DisposableObserver<T> observer, Params params) {
    Preconditions.checkNotNull(observer);

    final Observable<T> observable = this.buildUseCaseObservable(params)
      .subscribeOn(subscribeScheduler)
      .observeOn(observeScheduler);

    addDisposable(observable.subscribeWith(observer));
  }

1 个答案:

答案 0 :(得分:1)

就我而言,一个用例就是一个动作。

我的建议是创建两个用例,一个用于获取数据,另一个用于将数据保存到数据库中,它的可读性和可维护性更好。

因此,一旦获取数据,数据应该返回到演示者,例如:

@Override
public void onDataFetched(Data data){
    mPresenterView.displayData(data);
    mDatabaseUseCase.execute(databaseObserver, databaseParams);
}

因此,即使数据库失败,也会显示数据。

希望这会有所帮助。 抱歉我的英文。