RxJava Single.concat

时间:2017-08-18 10:50:45

标签: rx-java2

我有以下代码:

 model.getCategories()
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Action1<List<Category>>()
                {
                    @Override
                    public void call(final List<Category> categories)
                    {
                        model.getUnits()
                                .subscribeOn(Schedulers.io())
                                .observeOn(AndroidSchedulers.mainThread())
                                .subscribe(new Action1<List<Unit>>()
                                {
                                    @Override
                                    public void call(List<Unit> units)
                                    {
                                        view.showAddProductDialog(units, categories);
                                    }
                                });
                    }
                });

我有这种丑陋的筑巢。我该如何解决呢? 我试过这样的事情:

Single.concat(model.getCategories(), model.getUnits())
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Action1<List<? extends Object>>()
                {
                    @Override
                    public void call(List<? extends Object> objects)
                    {
                        // do something
                    }
                });

但问题是我无法确定是List<Category>还是List<Unit>

有没有办法使用concat并检测哪种类型的流(List<Category>List<Unit>或其他内容)?

此外,我需要检测所有观察者是否已完成以执行其他操作。

感谢您的建议。

1 个答案:

答案 0 :(得分:2)

使用Single.zip()

Single.zip(
    getCategories().subscribeOn(Schedulers.io()),
    getUnits().subscribeOn(Schedulers.io()),
    (a, b) -> Pair.of(a, b)
)
.observeOn(AndroidSchedulers.mainThread())
.subscribe(
    pair -> view.showAddProductDialog(pair.first, pair.second),
    error -> showError(error.toString())
)

其中Pair可以是任何元组实现,即this