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