rxjava上的链方法

时间:2016-08-09 14:56:14

标签: rx-java

如何在实现所有其他方法后调用方法。所有方法都有可观察性。

Observable.just(""
    )
            .subscribe(new Subscriber<String>() {
        @Override
        public void onCompleted() {
            Log.d(TAG, "onCompleted: loading config");
            loadConfiguration();

        }

        @Override
        public void onError(Throwable e) {

        }

        @Override
        public void onNext(String s) {
            Log.d(TAG, "onNext: loading data");
            initOperatorData();
            initCompanyData();
            initVehicleData();
            initToolsData();
        }
    });

private void initCompanyData() {
    Subscription subscription = db.loadDataMaster()
            .map(new Func1<RealmResults<DataMaster>, List<String>>() {
                @Override
                public List<String> call(RealmResults<DataMaster> dataMasters) {
                    List<String> companies = getCompanyNames(dataMasters);
                    return companies;
                }
            })
            .subscribe(new Action1<List<String>>() {
                @Override
                public void call(List<String> companyNames) {
                    setCompanyNames(companyNames);
                }
            });}

我想在“onNext”上调用那些方法的observable一旦完成,我就在onComplete中调用它。但这不会发生,因为它们都是异步的。 onComplete发生在initToolsData之前。

有没有办法异步链接到方法的调用?

2 个答案:

答案 0 :(得分:1)

我假设您的所有init*loadConfiguration方法都返回Observable

在这种情况下,您可以merge所有Oservable然后concatWithObservable创建的另一个loadConfiguration

 Observable.merge(initOperatorData(), initCompanyData(), initVehicleData(), initToolsData())
           // I force to cast to Object otherwise, it may not compile, dependings of your methods signatures
           .cast(Object.class)
           // you'll subscribe to loadConfiguration when all previous Observable will be completed
           .concatwith(loadConfiguration())
           .subscribe();

答案 1 :(得分:0)

让我们尝试简化(并原谅Java 8,它使逻辑更合理):

Observable.merge(
        initOperatorData().subscribeOn(Schedulers.io()),
        initCompanyData() .subscribeOn(Schedulers.io()),
        initVehicleData() .subscribeOn(Schedulers.io()),
        initToolsData()   .subscribeOn(Schedulers.io()))
.ignoreElements()
.doOnComplete(() -> loadConfiguration())
.toBlocking()
.subscribe();

private Observable<?> initCompanyData() {
    return db
        .loadDataMaster()
        .doOnNext(dataMasters -> setCompanyNames(getCompanyNames(dataMasters)));
}

更难以理解,你不说吗?顺便说一句,如果您不需要等待loadConfiguration()方法的完成,则可以省略.toBlocking()来电。此外,如果您打算在少于4个核心的手机上运行此计划,则应使用computation()计划程序。