如何摆脱嵌套的RxJava流?

时间:2019-04-07 14:39:07

标签: java android retrofit rx-java2

我接到互联网,数据库的电话,结果我向用户显示了收集的信息。现在,我有非常丑陋的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) {
                    }
                }));
    }

2 个答案:

答案 0 :(得分: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);
        })
);

但是,如果您使用反应性数据库层(例如Room的LiveData<List<T>>支持),则实际上可以放弃modelManager.loadFromDatabase()部分。

答案 1 :(得分:2)

b意味着将一个流的结果转换为另一个流,这很可能是您想要的。

因为您有一个false会发出一个flatMap,所以您还有另一个“ Observable s的源”,它将这个ApiResponse并给出另一个Observable您想观察的地方。

所以您可能想要这样的东西:

ApiResponse