2017-04-15 57 views
1

我正在学习Android上的rxjava,并想完成从互联网获取数据的任务,显示查看并将其保存到数据库。Rxjava Android网络通话后保存到数据库?

一旦数据是从互联网上获取的,我想在并行,

  • 显示获取的数据,以查看
  • 保存到数据库(在计算线程)

而且,

  • 如果网络获取成功,则显示为查看并保存到数据库(并行)
  • 如果网络抓取失败,跳过整个过程(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)); 

基地用例(域模块)

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

'网络 - >数据库 - >查看'对我来说更有意义 – Jahnold

回答

0

为了我的观点来看,用例为一个动作。

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

所以一旦数据被取出,数据应该退还给提示,对于为例:

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

所以即使数据库失败时显示的数据。

希望这会有所帮助。 对不起,我的英语。