Android中使用EventBus事件发布/订阅框架实现事件传递
場景
EventBus
EventBus是一種用于Android的事件發布-訂閱總線。它簡化了應用程序內各個組件之間進行通信的復雜度,尤其是碎片之間進行通信的問題,可以避免由于使用廣播通信而帶來的諸多不便。
官方文檔
https://greenrobot.org/eventbus/documentation/
使用場景
在做項目的時候往往需要應用程序內各組件間、組件與后臺線程間的通信。比如耗時操作,等耗時操作完成后通過Handler或Broadcast將結果通知給UI,N個Activity之間需要通過Listener通信,又比如本文將要介紹的在接收到MQTT推送的回調方法中將消息顯示在系統通知欄中,這些都可以通過EventBus輕松實現,EventBus通過發布/訂閱(publish/subscribe)方式來管理事件總線。
三個角色
Event:事件,它可以是任意類型,EventBus會根據事件類型進行全局的通知。
Subscriber:事件訂閱者,在EventBus 3.0之前我們必須定義以onEvent開頭的那幾個方法,分別是onEvent、onEventMainThread、onEventBackgroundThread和onEventAsync,而在3.0之后事件處理的方法名可以隨意取,不過需要加上注解@subscribe,并且指定線程模型,默認是POSTING。
Publisher:事件的發布者,可以在任意線程里發布事件。一般情況下,使用EventBus.getDefault()就可以得到一個EventBus對象,然后再調用post(Object)方法即可。
四種線程模型
POSTING:默認,表示事件處理函數的線程跟發布事件的線程在同一個線程。
MAIN:表示事件處理函數的線程在主線程(UI)線程,因此在這里不能進行耗時操作。
BACKGROUND:表示事件處理函數的線程在后臺線程,因此不能進行UI操作。如果發布事件的線程是主線程(UI線程),那么事件處理函數將會開啟一個后臺線程,如果果發布事件的線程是在后臺線程,那么事件處理函數就使用該線程。
ASYNC:表示無論事件發布的線程是哪一個,事件處理函數始終會新建一個子線程運行,同樣不能進行UI操作。
注:
博客:
https://blog.csdn.net/badao_liumang_qizhi
關注公眾號
霸道的程序猿
獲取編程相關電子書、教程推送與免費下載。
實現
官網給出的快速開始的文檔
https://greenrobot.org/eventbus/documentation/how-to-get-started/
?
這里我們以接收到MQTT服務器發的消息后的回調方法中去傳遞給主線程去在通知欄顯示通知消息為例
這里還使用了EventBus的StickyEvents黏性事件
StickyEvents黏性事件
何為黏性事件呢?簡單講,就是在發送事件之后再訂閱該事件也能收到該事件,跟黏性廣播類似。
官方文檔:
https://greenrobot.org/eventbus/documentation/configuration/sticky-events/
直譯:
有些事件在事件發布后會攜帶一些感興趣的信息。例如,事件表示某個初始化已經完成。或者你有一些傳感器或位置數據你想保持最近的值。您可以使用粘滯事件,而不是實現自己的緩存。EventBus將特定類型的最后一個sticky事件保存在內存中。然后,可以將sticky事件交付給訂閱者或顯式查詢。因此,您不需要任何特殊的邏輯來考慮已經可用的數據。
使用EventBus
在build.gradle中引入依賴
??? //Event bus用來傳遞消息implementation 'org.greenrobot:eventbus:3.0.0'然后按照官方文檔快速開始的說明,新建一個消息事件實體MessageEvent
public class MessageEvent {private String message;public MessageEvent(String message) {this.message = message;}public String getMessage() {return message;}public void setMessage(String message) {this.message = message;} }然后在需要訂閱事件的地方進行注冊事件并進行事件的處理,這里是要在MainActivity中進行通知欄顯示消息,所以在MainActivity的onCreate方法中
??????? //在需要訂閱事件的地方注冊事件EventBus.getDefault().register(this);然后還需要在MainActivity中進行事件的處理
??? //處理事件@Subscribe(threadMode = ThreadMode.MAIN, sticky = true)public void showTheEventMessage(MessageEvent messageEvent) {Log.i(TAG, "showTheEventMessage: show notification");showNotification(this, messageEvent.getMessage());}即進行顯示通知欄消息的操作。
然后在收到MQTT消息的回調方法中
EventBus.getDefault().postSticky(new MessageEvent(msg));進行發布消息,其中msg是傳遞的消息的字符串內容
上面完整實現流程
Android中連接MQTT服務器實現訂閱主題并接收消息推送在通知欄顯示(附代碼下載):
https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/112466469
?
?
?
總結
以上是生活随笔為你收集整理的Android中使用EventBus事件发布/订阅框架实现事件传递的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android中使用Notificati
- 下一篇: Windows服务器上Mqtt服务器EM