2017-03-17 43 views
0

我目前正在研究更好的方式来处理我的应用程序中的事件。 目前我有多个正在订阅和取消订阅不同事件上的有趣对象的侦听器。自定义事件总线与RxJava/RxAndroid的后备观察员?

E.g.在一个按钮上单击一个侦听器被创建,侦听客户端对象,操作是否成功(在这种情况下,它会自动注销自己),或者是否发生非致命错误(在这种情况下会自动重试该操作)。

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

在我的应用程序,我有一个非常大的听众混乱,这是不容易遵循,并没有在所有场合工作。

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


问题:
是否有可能与RxJava有一个后备观察员观察到的一个,对事件做出反应,如果没有其他观察者可用?

E.g.所有活动/片段都会自行注册以了解某些事件,以便他们可以根据需要更新UI。 当活动/片段被创建/销毁时,它会自动向事件总线注册/取消注册。

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

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

回答

1

在我看来,你的应用在背景中不应该显示任何东西(用户不再对它感兴趣,或者正在做其他事情,所以不要用吐司给他发垃圾邮件(因为他可能甚至不知道)哪个应用程序提出了这个敬酒))。

然而,

您可以Subject解决这个问题。假设你有MyServiceErrorHandler类与PublishSubject>里面,所以每次有一部分UI是可见的并且能够显示错误是应该订阅这个主题。然后你可以暴露像onError(Throwable t)这样的方法,它会调用subject.hasObservers()。如果是,它将数据推送到主题(所以它会发出一个事件给当前订阅的用户界面),如果没有你可以做一些回退的事情(如显示吐司/通知/记录东西/等)。然而,这种解决方案很容易出现旋转,因为在屏幕旋转时您可能会收到结果(因此尚未订购)

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