說到eventbus,想必大家都不陌生,咦~~~~你沒聽過,好吧,你還要認真學習啊,這篇部落格不是去分析eventbus的原始碼的,也不是講什麼人生哲理,就是教大家如何使用這麼乙個神器,以後誰要是問你eventbus會不會用。。。你就可以驕傲的炫耀你的車技了,並將他領上車
1.初步理解
2.新手入門入門
好了下面直接教大家如何使用
(1)eventbus配置
eventbus框架也是採用建造者模式設計的,可以通過eventbusbuilder來設定一些配置資訊,例如設定debug模式下要丟擲異常
eventbus eventbus=eventbus.builder().throwsubscriberexception(buildconfig.debug
.build();
(2)新增引用compile 'org.greenrobot:eventbus:3.0.0'
( 3 ) 定義乙個事件型別public
class myevent
public string getmsg()
public
void
setmsg(string msg)
}
(4)訂閱/解除訂閱eventbus.getdefault().register(this);//訂閱
eventbus.getdefault().unregister(this);//解除訂閱
有人問我這玩意兒放在**,好吧,我告訴你放在**,首先寫乙個封裝類,
public
class eventutil
}//解除
public
static
void
unregister(object context)
}//傳送訊息
public
static
void
post(object object)
}
然後如果是activity內接收訊息,就在oncreate和ondestroy中呼叫,如果是fragment呢,好吧也是還是在這兩個方法中。。。。。。。不過就變成了
eventutil.register(this);//訂閱事件
eventutil.register(this);//取消事件
(5)發布事件
eventbus.getdefault().post(new datasynevent());
(6)訂閱事件處理@subscribe(threadmode = threadmode.main) //在ui執行緒執行
public
void
ondatasynevent(datasynevent event)
threadmode總共四個:
nain ui主線程他們有啥子用呢,其實就是告訴你只有在主線程中才能更新ui,主線程中不要做耗時操作,如果有必要需要和handler一起使用background 後台執行緒
posting 和發布者處在同乙個執行緒
async 非同步執行緒
(7)訂閱事件的優先順序
說到優先順序,其實和boardcast接收者的優先順序差不多,數越大優先順序越高,一般0-100吧
@subscribe(threadmode = threadmode.main,priority = 100) //在ui執行緒執行 優先順序100
public
void
ondatasynevent(datasynevent event)
有了優先順序,有人就該問了,是不是可以對訊息進行截獲,不讓它往下發呢,這個當然可以了
eventbus.getdefault().canceleventdelivery(event) ;//優先順序高的訂閱者可以終止事件往下傳遞
(8)eventbus黏性事件我們在學廣播的時候有一種廣播叫粘性廣播。如果使用普通廣播send乙個訊息,然後在你的onreceive中執行超過10秒的話,這個廣播的狀態就會變為可以被乾掉的狀態,而粘性廣播就是為了解除這個10秒限制。但是為了安全起見,忘了在哪個版本的sdk把這玩意給廢棄掉了。
那麼回到我們的問題,當你傳送訊息的時刻和註冊訊息接收的時刻 並不能確定順序,比如你請求網路資料和訂閱事件 同時執行,如果資料返回的特別快呀快,那你 eventutil.register(this)這句**還沒執行完呀,這時候你就就收不到這個訊息了
這個概念這麼理解,就像qq郵件裡有個訂閱的功能,如果你訂閱了乙個公眾郵件,那麼他們就會給你推送訊息,但是你卻接收不到你訂閱之前他們推送的訊息
@subscribe(threadmode = threadmode.main,sticky = true) //在ui執行緒執行
public
void
ondatasynevent(datasynevent event)
2.4版本的時候有乙個傳送粘性事件的方法, 後來發現原來3.0還是有這個方法的,所以就這麼傳送粘性事件
eventbus.getdefault().poststicky(new testevent());
我們知道這個粘性事件是存在靜態變數裡的,就是如果你不乾掉他,他就一直在,這時候需要在的ondestory中呼叫這個
eventbus.getdefault().removestickyevent(new testevent());//移除乙個
eventbus.getdefault().removeallstickyevents();//移除全部
(9)eventbus processor使用
專案的build.gradle中配置
buildscript
}
apt
}dependencies
此時編譯一次,自動生成生成索引類。在\build\generated\source\apt\pakagename\下看到通過註解分析生成的索引類,這樣我們便可以在初始化eventbus時應用我們生成的索引了。
新增索引到eventbus預設的單例中
這玩意主要是為了提高這句**的速度
eventbus.getdefault().register(this);
(10)**的混淆
我發現好多人都為這個問題糾結,最後找不到錯就直接不混淆了,呵呵呵
先來個全的
-keepattributes *annotation*//keep反射
-keepclassmembers class *
-keep enum org.greenrobot.eventbus.threadmode
# only required if you use asyncexecutor//如果你使用了async 非同步執行緒
-keepclassmembers class * extends
org.greenrobot.eventbus.util.throwablefailureevent
好了關於eventbus的使用就這些內容,如果你想再了解一下原始碼,這裡是傳送門
eventbus 3.0 源**分析
還有這些個**
android訊息傳遞之eventbus 3.0使用詳解(三)
Spring data Jpa使用過程中遇到的坑
一定要注意如果我們在實體類中沒有配置資料表的預設值,那麼在存入和取出的時候應該設定。否則在取出的時候就會出現問題。如何通過一方獲取到多方實體 jsp中 jsp資料夾與上面servlet對映名最好不要一致,這樣會出問題 注意!乙個實體類的表id名字請設定為id,保證不出錯。問題分析 解決方法 其實一般...
element ui dialog使用過程中的坑
場景一 我們將dialog寫成乙個可復用的公共元件用於顯示不同內容 如 操作中的修改或新增的彈窗 之後發現dialog的遮罩將彈出層 點選修改或新增後理應由乙個彈窗顯示出來 都蓋住了,而我想要的效果是遮罩只遮住舊的視窗,而當前視窗應該完全顯示 注 是使用easyui的panel和window來包裹的...
Glide使用過程中遇到的坑
專案之前使用的載入庫是universal image loader,但是此庫已經好久不維護了,同時也發現了更加不錯的載入庫,也就是glide,用起來很方便並且記憶體佔用量還很令人滿意,所以決定大刀闊斧的將之前的載入庫換成glide。但是在換使用者頭像相關模組的時候發現問題了,就是載入網路時第一次載入...