我正在尝试将RxJava与Android一起使用来异步更新我的视图。当用户从回收器视图中的列表中单击电影时,我想首先向他展示数据库中的电影(如果存在(。然后我想获取最新信息并更新数据库和 UI。我正在尝试使用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);
}
在肯定我的代码有效并指导我从@akarnokd进行故障排除后,我发现最新的代码(参见 OP(完美运行。RxJava 链的结果被发布到 LiveData 对象,该对象应更新 View。不幸的是,它只发布最新数据(这是一个错误(并跳过第一个数据(这是数据库中的数据(。
我会处理这个问题,但由于这篇文章涉及 RxJava,我会认为这个问题已经解决了!