日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

Android中使用EventBus事件发布/订阅框架实现事件传递

發(fā)布時(shí)間:2025/3/19 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android中使用EventBus事件发布/订阅框架实现事件传递 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

場(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。