代码之家  ›  专栏  ›  技术社区  ›  Stefano Mtangoo

single.concat报告错误并继续下一个

  •  0
  • Stefano Mtangoo  · 技术社区  · 7 年前

    我正在尝试将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);
        }
    
    1 回复  |  直到 7 年前
        1
  •  0
  •   Stefano Mtangoo    7 年前

    确认我的代码有效,并提供故障排除指南 @akarnokd 我发现最新的代码(见op)工作得完美无缺。rxjava链的结果被发布到livedata对象,该对象应该更新视图。不幸的是,它只发布最新的数据(这是一个错误)并跳过第一个(这是来自数据库的数据)。

    我会处理这个问题,但由于文章涉及rxjava,我会考虑解决这个问题!