首页 > 解决方案 > 如何摆脱嵌套的 RxJava 流?

问题描述

我有一系列对互联网、数据库的调用,结果我向用户显示收集的信息。现在我有非常难看的 3 级嵌套 RxJava 流。我真的很想让它流畅且易于阅读,但我真的很难坚持。

我已经阅读了有关 Map、flatMap、zip 等的所有内容。不能让事情协同工作。

代码:进行api调用。在第一个流的 onSuccess 方法中将接收到的信息放入数据库中订阅另一个流,并在从数据库信息接收到的第二个流的 onSuccess 方法中最终显示给用户。

达特弗兰肯斯坦:

disposables.add(modelManager.apiCall()
                .subscribeOn(Schedulers.io())
                .observeOn(mainThread)
                .subscribeWith(new DisposableSingleObserver {

                  public void onSuccess(ApiResponse apiResponse) {

                        modelManager.storeInDatabase(apiResponse)
                       //level 1 nested stream:
                        disposables.add(modelManager.loadFromDatabas()
                                  .subscribeOn(Schedulers.io())
                                  .observeOn(mainThread)
                                  .subscribeWith(new DisposableSingleObserver{
                                    public void onSuccess(Data data) {
                                        view.showData(data);
                                    }
                                    public void onError(Throwable e) {
                                    }
                                }));
                    }
                    @Override
                    public void onError(Throwable e) {
                    }
                }));
    }

标签: javaandroidretrofitrx-java2

解决方案


我已经阅读了有关 Map、flatMap、zip 等的所有内容。不能让事情协同工作。

好吧,你错过了一些关于的东西flatMap,因为这就是它的用途;)


disposables.add(
    modelManager.apiCall()
        .subscribeOn(Schedulers.io())
        .doOnSuccess((apiResponse) -> {
            modelManager.storeInDatabase(apiResponse)
        })
        .flatMap((apiResponse) -> {
            modelManager.loadFromDatabase()
        })
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe((data) -> {
            view.showData(data);
        })
);

但是,如果您使用像 RoomLiveData<List<T>>支持这样的反应式数据库层,那么您实际上可以放弃该modelManager.loadFromDatabase()部分。


推荐阅读