我目前正在研究如何更好地处理我的应用中的事件。 目前,我有多个订阅者订阅和取消订阅不同事件的有趣对象。
E.g。在按钮上单击创建一个监听器,监听客户端对象,如果操作成功(在这种情况下它会自动取消注册)或者发生非致命错误(在这种情况下它会自动重试操作)。
客户端对象依次启动一个可以发出不同状态事件的android服务,如果应用程序当前不可见,应该会导致用户界面自行更新或者显示通知。
在我的应用程序中,我有一个非常大的倾听者混乱,这不容易遵循,并且不适用于所有场合。
要解决此问题,我想使用RxJava实现一个事件总线,希望能够降低应用程序的复杂性。
问题:
如果没有其他观察者可用,RxJava是否可以为可观察事件设置回退观察者,对事件作出反应?
E.g。所有活动/片段都会自行注册以获取有关某些事件的信息,因此如有必要,他们可以更新UI。 当创建/销毁活动/片段时,它会自动从事件总线注册/取消注册。
如果应用程序现在处于后台,则不应再注册观察者了。在这种情况下,我只想使用处理这些事件的后备观察者。
我想实现以下目标:
如果在前景:On事件,请更新UI
如果在后台:在事件上,显示吐司/通知。
答案 0 :(得分:1)
在我看来,你的应用程序不应该在后台显示任何内容(用户不再对它感兴趣,或者正在做其他事情,所以不要用toast向他发送垃圾邮件(因为他可能根本不知道哪个)申请提出这个吐司))。
然而,
您可以使用Subject
解决此问题。假设你内部有MyServiceErrorHandler
PublishSubject>
类,所以每当有一部分UI可见并且能够显示错误时,应该订阅这个主题。然后,您可以展示onError(Throwable t)
之类的方法,该方法将调用subject.hasObservers()
。如果是,则将数据推送到主题(因此它将向当前订阅的UI发出事件),如果没有你可以做一些后备的事情(比如显示toast / notification / logging something / etc)。然而,此解决方案容易出现旋转,因为您可能会在屏幕旋转时收到结果(因此尚未订阅)
您可以稍微扩展此方法并使用BehaviourSubject
,它将为每个订阅者重放它的最后一个事件(在屏幕旋转的情况下非常方便)。因此,即使没有订阅者,您也会将事件发布到此主题,并且当用户再次打开此应用程序(并且您的某个UI元素将订阅)时,它将收到错误的最后一个事件(因此您可以正确显示它)。但是在该解决方案中,如果出现过时/已经消耗的错误(以防止它在每次旋转/等等时显示),那么clear
这个主题需要更多的逻辑。