Single.concat 报告错误并继续执行下一个操作



我正在尝试将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,我会认为这个问题已经解决了!

最新更新