Single.concat报告错误,然后继续下一个

时间:2018-06-25 06:14:37

标签: android rx-java2

我正在尝试将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);
    }

1 个答案:

答案 0 :(得分:0)

在确认我的代码可以正常工作并从@akarnokd开始进行故障排除指南后,我发现最新代码(请参阅OP)可以正常工作。 RxJava链的结果发布到LiveData对象,该对象应该更新View。不幸的是,它仅发布最新数据(这是一个错误),并跳过第一个数据(这是来自数据库的数据)。

我将处理此问题,但由于该帖子涉及RxJava,因此我认为这已解决!