RxJava:观察来自多个观察者的单个执行

时间:2016-10-27 18:50:59

标签: android rx-java rx-android

在我的应用运行之前,我必须做一些配置,例如安装异常处理程序。因为我的应用有多个入口点(一个Activity,一个SyncAdapter)我只想在我的Application课程中执行此配置一次,并在入口点({{1} },Activity)。如果在入口点开始时配置已经完成,则仍应提供有关结果的信息。

那是SyncAdapter类中的Observable(RxJava 2):

Application

ConnectableObservable<Boolean> observable = Observable.create(…) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .cache() .publish(); observable.connect(); 中的观察者:

Activity

那是observable.subscribe(…); observable.connect(); 中的观察者:

SyncAdapter

observable.blockingSubscribe(…); observable.connect(); Observable中的观察者正在做我想要的事情,即使观察者在Activity完成工作后连接,也会立即完成。但是Observable中的观察者在SyncAdapter完成工作后连接时会永远阻塞。

我的问题:

  • 我缺少什么?
  • 有没有办法以更惯用的方式解决这个问题,例如:使用Observable

1 个答案:

答案 0 :(得分:0)

你最有可能让她陷入僵局:

.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())

结合:

observable.blockingSubscribe(…);

您在线程池上开始订阅。生成的值将移动到ui循环。同时,您订阅了observable并在ui-loop(主线程)上阻止订阅。在阻止订阅时,由于主线程已被阻止,因此无法推送任何值:死锁。

为什么不使用:

observable.filter(aBoolean -> aBoolean)
                .subscribe(aBoolean -> {
                    // is True so do stuff here::::::
                });

请查看可能的解决方案: https://gist.github.com/SergejIsbrecht/2d6a20283d7c3ea304af0cf54f0650b4