我正在从不同的服务电话中获取某人的信息。一些可以并行执行。其他依赖于并行调用返回的信息。 计算完所有信息后,我会将人员信息保存到存储库中
这是我设置流程的方式:
并行调用:
private Observable<Person> getDataForEval(Person person){
Person person = new Person();
Observable<Salary> observeSalary = getSalary(person).subscribeOn(Schedulers.io);
Observable<HomeAddress> observeHome = getHomeAddress(person).subscribeOn(Schedulers.io);
return Observable.zip(observeSalary , observeHome , (salary, home) -> buildPersonAfterGettingData(salary,home));
}
从属计算:
private Observable<Person> getDataAfterCalc(Person person) {
Observable<LoanEligiblity> loanEligible= getLoanEligibility(person);
Observable<Tax> observeTax= getTax(person);
return Observable.zip(loanEligible, observeTax, (loan, tax) ->
buildFinalPersonInfo(loan, tax));
}
在主线程中同时绑定两者:
Observable<Person> finalPersonInfo = getDataForEval.flatMap(person -> getDataAfterCalc(person));
finalPersonInfo.subscribe( finalPerson -> save(finalPerson));
问题-此流程何时触发?我的理解是,当主线程调用subscription方法时,将触发用于进行并行调用的Observable.zip(),随后的订阅者将获得响应。
对吗?如果我需要了解处理一个人所花费的时间,我可以按以下方式进行计算:
finalPersonInfo.onSubscribe(()->start).onTerminate(()->finish);
答案 0 :(得分:1)
您的理解几乎是正确的。
zip
运算符在下游订阅时订阅其源。参见ObservableZip#72
和ObservableZip#110
。
但是zip
运算符与并行运算无关,并行调用是因为subscribeOn
运算符。
您用来处理一个人的时间测量方法是正确的。
在这种情况下,应该使用Single
而不是Observable
。
Single
类为单个值响应实现响应模式。Single
的行为与Observable相同,除了它只能发出一个成功值或一个错误(没有Observable的“ onComplete”通知)
我的RxJava源版本为2.1.13