【问题标题】:RxJava: Observe single execution from multiple observersRxJava:从多个观察者观察单个执行
【发布时间】:2016-10-28 04:23:28
【问题描述】:

我必须在我的应用程序运行之前进行一些配置,例如安装异常处理程序。因为我的应用程序有多个入口点(ActivitySyncAdapter)我只想在我的Application 类中执行此配置一次并在入口点(ActivitySyncAdapter)上观察它。如果入口点启动时配置已经完成,那么关于结果的信息应该仍然可用。

这是Application 类中的Observable (RxJava 2):

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

ObservableActivity 中的观察者正在做我想做的事情,即使在 Observable 完成工作后观察者连接时也会立即完成。但是如果Observable 完成工作后连接,SyncAdapter 中的观察者将永远阻塞。

我的问题:

  • 我错过了什么?
  • 有没有办法以更惯用的方式解决这个问题,例如通过使用Completable?

【问题讨论】:

  • 你能展示一下 Observable.create(...) 的实现吗?为什么要在 SyncAdapter 中使用 blockinSub 而不是在 Activity 中?如果你错过了“真实”,你将因为 observable (publish-connect) 的热特性而永远阻塞。

标签: android rx-java rx-android


【解决方案1】:

你很可能让她陷入僵局:

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

结合:

observable.blockingSubscribe(…);

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

为什么不使用:

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

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

【讨论】:

    猜你喜欢
    • 2018-06-11
    • 2021-04-13
    • 1970-01-01
    • 1970-01-01
    • 2011-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-17
    相关资源
    最近更新 更多