如何摆脱嵌套的 RxJava 流?

Sta*_*ool 5 java android retrofit rx-java2

我对互联网、数据库进行了一系列调用,结果我向用户显示收集到的信息。现在我有非常难看的三层嵌套 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) {
                    }
                }));
    }
Run Code Online (Sandbox Code Playgroud)

Epi*_*rce 3

我已经阅读了有关 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);
        })
);
Run Code Online (Sandbox Code Playgroud)

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