EventBus3.0防踩坑指南

? ? 實用過EventBus的人都知道,這個輕量簡便的lib真的很好用,耦合度低,

能滿足很多場合的使用,不過3.0貌似更好用了,使用也更靈活了。下面給出

官方的使用地址,大家可以去官網(wǎng)了解熟悉下,EventBus3.0.

? ? Event的使用,3.0引入管擦著模式,Subscriber:事件訂閱者,在EventBus3.0

之前消息處理的方法只能限定于onEvent、onEventMainThread、onEventBackgr

oundThread和onEventAsync,他們分別代表四種線程模型。而在EventBus3.0之后

,事件處理的方法可以隨便取名,但是需要添加一個注解@Subscribe,并且要指定

線程模型(默認(rèn)為POSTING),四種線程模型下面會講到。

? ? ? ?EventBus3.0線程模式

? ? ? POSTING(默認(rèn)):如果使用事件處理函數(shù)指定了線程模型為POSTING,那么該事

件在哪個線程發(fā)布出來的,事件處理函數(shù)就會在這個線程中運行,也就是說發(fā)布事件和

接收事件在同一個線程。在線程模型為POSTING的事件處理函數(shù)中盡量避免執(zhí)行耗時操

作,因為它會阻塞事件的傳遞,甚至有可能會引起ANR。

? ? ? MAIN:事件的處理會在UI線程中執(zhí)行。事件處理時間不能太長,長了會ANR的。

? ? ? BACKGROUND:如果事件是在UI線程中發(fā)布出來的,那么該事件處理函數(shù)就會在

新的線程中運行,如果事件本來就是子線程中發(fā)布出來的,那么該事件處理函數(shù)直接在

發(fā)布事件的線程中執(zhí)行。在此事件處理函數(shù)中禁止進(jìn)行UI更新操作。

? ? ? ASYNC:無論事件在哪個線程發(fā)布,該事件處理函數(shù)都會在新建的子線程中執(zhí)行,

同樣,此事件處理函數(shù)中禁止進(jìn)行UI更新操作。

? ? ? 四種線程,大家可以根據(jù)需要對線程進(jìn)行控制,線程模式是的EventBus使用起來更

加靈活,選擇性也更多。說了這么多沒用的 下面?zhèn)€大家介紹下到底怎么用

? ? ? 使用之前,需要先在gradle中添加

? ? ? //EventBus

? ? ? compile'org.greenrobot:eventbus:3.0.0'

? ? ? 主要方法 事件訂閱,也就是之前的注冊? EventBus.getDefault().register(this);

? ? ? ? ? ? ? ? ? ? ? 取消訂閱? EventBus.getDefault().unregister(this);

? ? ? ? ? ? ? ? ? ? ? 事件發(fā)送? EventBus.getDefault().post(messageEvent);

? ? ? ? ? ? ? ? ? ? ? 事件接收 @Subscribe(threadMode=ThreadMode.MAIN)

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?public void onMessageEvent(PostEventevent) {}

? ? ? ? ? ? ? ? ? ? ? 粘性事件? EventBus.getDefault().postSticky() (粘性事件是發(fā)送后再訂閱,

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 異于普通事件)

? ? ?用法 ?創(chuàng)建一個java類 public class PostEvent{/** ?類的名字沒有局限性,可以隨意定

? ? ? ? ? ? ? ?義 ? */} ?EventBus.getDefault().post(new PostEvent()) 這個時候 ,就可以在需

? ? ? ? ? ? ? 要的地方發(fā)送事件了 onMessageEvent 可以用來接收所發(fā)送的事件

? ? ? 下面給出我的代碼截圖


MainActivity


TestActivity


PostEvent

? ? ? 代碼很簡單,這里我沒有使用粘性事件。上面是根據(jù)官方接收的使用方法來實現(xiàn)的

,不過既然是防踩坑,好像跑題了,下面給大家講解我遇到的情況。

A。

官方使用指南

? ? ? 官網(wǎng)上說的是要在onStart()中進(jìn)行訂閱,在onStop()中進(jìn)行取消定語,單貌似這樣在

Activity中是行不通的,這樣無法接收到事件。熟悉Activity生命周期的都應(yīng)該知道為什么

吧,這里不再贅述,個人建議,事件訂閱放在onCreate()方法中,而注銷,要放在onD

estory()中。

B。之前查閱的時候,有人說EventBus3.0要處理不同場所發(fā)出的事件的時候要寫不同的

java類,這養(yǎng)就要寫很多的java事件類,請注意看我上面寫的PostEvent類(可根據(jù)需

要,自行進(jìn)行擴(kuò)展),在這個類中我定義了三個 變量 tag(事件標(biāo)簽 、代號) what(事件

類型,不同事件對應(yīng)不同類型)event (事件內(nèi)容)。這樣就不需要對應(yīng)的事件寫不同的

java類了,而且,如果寫了那么多類,你分得清楚你接收的是哪個java類么?無形中不是

給自己增加了麻煩嗎?


? ? ? 不知道上面的兩個問題 ,大家有沒有遇到呢?

? ? 總結(jié):1.使用之前,需要先下載,compile'org.greenrobot:eventbus:3.0.0'加到gradle

? ? ? ? ? ? ? ? ? ?中

? ? ? ? ? ? ? ?2. 使用常規(guī)的訂閱及解訂閱方式,在需要的地方發(fā)送事件,事件類根據(jù)自己需

? ? ? ? ? ? ? ? ? ?要自行定義

? ? ? ? ? ? ? 3. 在需要的地方調(diào)用 onMessageEvent進(jìn)行事件接收(訂閱過事件一定要解除

? ? ? ? ? ? ? ? ?訂 閱,并且 訂閱過事件后必須調(diào)用onMessageEvent()方法),不要忘了注

? ? ? ? ? ? ? ? ?解@Subscribe(threadMode=ThreadMode.MAIN) 線程根據(jù)需要自己切換

? ? ? ?以上為筆者愚見,并且在使用過程中遇到的問題處理方式,工具都是怎么簡單怎么

來,易于維護(hù)才是王道,當(dāng)然每個人都有自己得使用心得,適合自己得,才是最好的。

下面給出源碼,需要的可以下載看看?http://download.csdn.net/download/qq_27234017/9990752

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • “Some Interesting Open Source Projects of Android”這個系列主要是...
    Burjal閱讀 2,736評論 2 10
  • 原文鏈接:http://blog.csdn.net/u012810020/article/details/7005...
    tinyjoy閱讀 671評論 1 5
  • 簡介 我們知道,Android應(yīng)用主要是由4大組件構(gòu)成。當(dāng)我們進(jìn)行組件間通訊時,由于位于不同的組件,通信方式相對麻...
    Whyn閱讀 598評論 0 1
  • EventBus 是一個Android端優(yōu)化的 publish/subscribe 消息總線,簡化了應(yīng)用程序各個組...
    王世軍Steven閱讀 1,963評論 4 21
  • 前言:EventBus出來已經(jīng)有一段時間了,github上面也有很多開源項目中使用了EventBus。所以抽空學(xué)習(xí)...
    Kerry202閱讀 1,374評論 1 2

友情鏈接更多精彩內(nèi)容