2017-03-17 67 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元素將訂閱),它也會將事件發佈到此主題,但它將收到帶有錯誤的最後一個事件(以便您可以正確顯示)。但在該解決方案中,如果過時/已經消耗了錯誤(以防止它在每次旋轉/等等上顯示),您需要多一點邏輯來處理這個主題。