使用RxJava / RxAndroid自定义事件总线的后备观察员?

时间:2017-03-17 10:15:51

标签: android rx-java rx-android event-bus

我目前正在研究如何更好地处理我的应用中的事件。 目前,我有多个订阅者订阅和取消订阅不同事件的有趣对象。

E.g。在按钮上单击创建一个监听器,监听客户端对象,如果操作成功(在这种情况下它会自动取消注册)或者发生非致命错误(在这种情况下它会自动重试操作)。

客户端对象依次启动一个可以发出不同状态事件的android服务,如果应用程序当前不可见,应该会导致用户界面自行更新或者显示通知。

在我的应用程序中,我有一个非常大的倾听者混乱,这不容易遵循,并且不适用于所有场合。

要解决此问题,我想使用RxJava实现一个事件总线,希望能够降低应用程序的复杂性。

问题:
如果没有其他观察者可用,RxJava是否可以为可观察事件设置回退观察者,对事件作出反应?

E.g。所有活动/片段都会自行注册以获取有关某些事件的信息,因此如有必要,他们可以更新UI。 当创建/销毁活动/片段时,它会自动从事件总线注册/取消注册。

如果应用程序现在处于后台,则不应再注册观察者了。在这种情况下,我只想使用处理这些事件的后备观察者。

我想实现以下目标:
如果在前景:On事件,请更新UI 如果在后台:在事件上,显示吐司/通知。

1 个答案:

答案 0 :(得分:1)

在我看来,你的应用程序不应该在后台显示任何内容(用户不再对它感兴趣,或者正在做其他事情,所以不要用toast向他发送垃圾邮件(因为他可能根本不知道哪个)申请提出这个吐司))。

然而,

您可以使用Subject解决此问题。假设你内部有MyServiceErrorHandler PublishSubject>类,所以每当有一部分UI可见并且能够显示错误时,应该订阅这个主题。然后,您可以展示onError(Throwable t)之类的方法,该方法将调用subject.hasObservers()。如果是,则将数据推送到主题(因此它将向当前订阅的UI发出事件),如果没有你可以做一些后备的事情(比如显示toast / notification / logging something / etc)。然而,此解决方案容易出现旋转,因为您可能会在屏幕旋转时收到结果(因此尚未订阅)

您可以稍微扩展此方法并使用BehaviourSubject,它将为每个订阅者重放它的最后一个事件(在屏幕旋转的情况下非常方便)。因此,即使没有订阅者,您也会将事件发布到此主题,并且当用户再次打开此应用程序(并且您的某个UI元素将订阅)时,它将收到错误的最后一个事件(因此您可以正确显示它)。但是在该解决方案中,如果出现过时/已经消耗的错误(以防止它在每次旋转/等等时显示),那么clear这个主题需要更多的逻辑。