我正在尝试将RxJava与Android一起使用以异步更新我的视图。当用户从RecyclerView中的列表中单击影片时,我想首先将他与数据库中的影片(如果存在)一起呈现。然后,我想获取最新信息并更新数据库和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);
}
答案 0 :(得分:0)
在确认我的代码可以正常工作并从@akarnokd开始进行故障排除指南后,我发现最新代码(请参阅OP)可以正常工作。 RxJava链的结果发布到LiveData对象,该对象应该更新View。不幸的是,它仅发布最新数据(这是一个错误),并跳过第一个数据(这是来自数据库的数据)。
我将处理此问题,但由于该帖子涉及RxJava,因此我认为这已解决!