主线程何时触发可观察的链

时间:2018-07-11 17:23:35

标签: java java-8 rx-java observable rx-java2

我正在从不同的服务电话中获取某人的信息。一些可以并行执行。其他依赖于并行调用返回的信息。 计算完所有信息后,我会将人员信息保存到存储库中

这是我设置流程的方式:

并行调用:

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);

1 个答案:

答案 0 :(得分:1)

您的理解几乎是正确的。

zip运算符在下游订阅时订阅其源。参见ObservableZip#72ObservableZip#110

但是zip运算符与并行运算无关,并行调用是因为subscribeOn运算符。

您用来处理一个人的时间测量方法是正确的。

在这种情况下,应该使用Single而不是Observable

  

Single类为单个值响应实现响应模式。 Single的行为与Observable相同,除了它只能发出一个成功值或一个错误(没有Observable的“ onComplete”通知)

我的RxJava源版本为2.1.13