? ? 實用過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ā)送的事件
? ? ? 下面給出我的代碼截圖



? ? ? 代碼很簡單,這里我沒有使用粘性事件。上面是根據(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