我正在尝试将rxjava与android一起异步更新我的视图。当用户单击RecyclerView列表中的电影时,我想首先向他展示数据库中的电影(如果存在)。然后我想获取最新的信息,更新数据库和用户界面。我想用
concat
方法及其变体,但不起作用。
我跳过其他代码只是为了发布相关的RxJava方法,这些方法是在其他工作正常的情况下获取数据的。
当我使用下面的代码禁用网络连接时(因此远程返回错误),下面的代码根本不显示数据库中的数据。只有它报告错误。这意味着当地人没有解决问题。
public Flowable<Movie> getMovie(final int id) {
return Single.concat(mLocal.getMovie(id), mRemote.getMovie(id).doOnSuccess(data -> {
mLocal.save(data);
})).onErrorResumeNext(error->{
return Flowable.error(error);
});
}
在这段代码中,它工作得很好,只是现在我没有得到错误消息(这是正确的,因为我已经用来自数据库的新流替换了它)
public Flowable<Movie> getMovie(final int id) {
return Single.concat(mLocal.getMovie(id), mRemote.getMovie(id).doOnSuccess(data -> {
mLocal.save(data);
})).onErrorResumeNext(error->{
return mLocal.getMovie(id).toFlowable();
});
}
现在,如何先获取数据库数据,然后在更新数据后启动网络调用,并从数据库或网络调用中获取错误?
更新
最新的方法代码
// calling getMovie on mLocal or mRemote returns Single
public Flowable<Movie> getMovie(final int id) {
return Single.concat(mLocal.getMovie(id), mRemote.getMovie(id).doOnSuccess(data -> {
mLocal.insertMovie(data);
})).onErrorResumeNext(error -> {
return Flowable.error(error);
});
}
我这样称呼他们
public void loadMovie(int id)
{
Disposable d = mRepo.getMovie(id)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread(), true)
.doOnSubscribe(subscription -> {
subscription.request(Long.MAX_VALUE);
//post progress here
})
.subscribe(data -> {
//onNext
},
error -> {
//onError
},
() -> {
//onComplete
}
);
mDisposables.add(d);
}