如何在实现所有其他方法后调用方法。所有方法都有可观察性。
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之前。
有没有办法异步链接到方法的调用?
答案 0 :(得分:1)
我假设您的所有init*
和loadConfiguration
方法都返回Observable
。
在这种情况下,您可以merge
所有Oservable
然后concatWith
从Observable
创建的另一个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()
计划程序。