好久沒更新博客了,思來想去,時隔半年又重新了回來了 最近項目更新想用下greenrobot的eventbus,之前都是傳統(tǒng)的Intent,Handler,Broadcast...... eventbus出現(xiàn)的很早,只是咱們的項目還木有用上,今天就來看看這個吧
-
官方Eventbus
官方文檔 - 啥是EventBus?
EventBus是Android下高效的發(fā)布/訂閱事件總線機制。作用是可以代替?zhèn)鹘y(tǒng)的Intent,Handler,Broadcast或接口函數(shù)在Fragment,Activity,Service,線程之間傳遞數(shù)據(jù),執(zhí)行方法。特點是代碼簡潔,是一種發(fā)布訂閱設計模式(Publish/Subsribe),或稱作觀察者設計模式。 - 下載jar包或者直接Androidstudio里面引用
庫地址
build.gradle添加引用
compile 'org.greenrobot:eventbus:3.0.0'
-
官方圖解
EventBus
- EventBus 角色介紹
Event 傳遞的事件對象
Subscriber 事件的訂閱者
Publisher 事件的發(fā)布者
ThreadMode 定義函數(shù)在何種線程中執(zhí)行
- 定義一個事件類型
public class MsgEvent1 {
private String msg;
public MsgEvent1(String msg) {
super();
this.msg = msg;
}
public String getMsg() {
return msg;
}
}
- 訂閱者
@Subscribe
public void onMessageEvent(MessageEvent event){
Toast.makeText(getActivity(), event.message, Toast.LENGTH_SHORT).show();
}
@Subscribe
public void handleSomethingElse(SomeOtherEvent event){
doSomethingWith(event);
}
- 注冊和解綁EventBus,發(fā)送
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
EventBus.getDefault().register(this);
}
@Override
protected void onDestroy() {
super.onStop();
EventBus.getDefault().unregister(this);
}
發(fā)送事件
EventBus.getDefault().post(new MessageEvent("Hello EventBus!"));
EventBus中事件的發(fā)送及訂閱是通過事件類型,就是上面定義的MessageEvent,由他進行匹配
- EventBus四種線程模式
ThreadMode.POSTING ThreadMode.MAIN ThreadMode.BACKGROUND ThreadMode.ASYNC
- 默認模式
@Subscribe(threadMode = ThreadMode.POSTING)
public void onMessage(MessageEvent event) {
log(event.message);
}
ThreadMode.POSTING:默認使用該模式,表示該方法會在當前發(fā)布事件的線程執(zhí)行
ThreadMode.MAIN:表示會在UI線程中執(zhí)行
ThreadMode.BACKGROUND:若當前線程非UI線程則在當前線程中執(zhí)行,否則加入后臺任務隊列,使用線程池調用
ThreadMode.ASYNC:加入后臺任務隊列,使用線程池調用
Sticky Events使用方法
如果之前事件使用postSticky進行發(fā)布且執(zhí)行過,則當sticky為true的訂閱者再次訂閱時,會去stickyEvents去查找事件,然后立即去post執(zhí)行。
eg:
EventBus.getDefault().postSticky(new MessageEvent("Hello EventBus"));
@Subscribe(sticky = true)
public void onEvent(MessageEvent event) {
textField.setText(event.message);
}
如果使用也可以移除之前發(fā)布過的postSticky
eg:
MessageEvent stickyEvent = EventBus.getDefault().getStickyEvent(MessageEvent.class);
// Better check that an event was actually posted before
if(stickyEvent != null) {
EventBus.getDefault().removeStickyEvent(stickyEvent);
}
Subscriber Priorities(優(yōu)先級)
優(yōu)先級越高越優(yōu)先執(zhí)行,默認的優(yōu)先級為0,priority 設置優(yōu)先級別,整數(shù),數(shù)值越大優(yōu)先級別越高,則能優(yōu)先收到訂閱消息
@Subscribe(threadMode = ThreadMode.PostThread,priority = 1)
@Subscribe(threadMode = ThreadMode.MainThread,priority = 2)
@Subscribe(threadMode = ThreadMode.BackgroundThread,priority = 3)
@Subscribe(threadMode = ThreadMode.Async,priority = 4)
register的函數(shù)重載中有一個可以指定訂閱者的優(yōu)先級,我們知道EventBus中有一個事件類型到List<Subscription>的映射,在這個映射中,所有的Subscription是按priority排序的,這樣當post事件時,優(yōu)先級高的會先得到機會處理事件。
優(yōu)先級的一個應用就事,高優(yōu)先級的事件處理函數(shù)可以終于事件的傳遞,通過cancelEventDelivery方法,但有一點需要注意,這個事件的ThreadMode必須是PostThread,并且只能終于它在處理的事件。
缺點
無法進程間通信,如果一個應用內有多個進程的話就沒辦法了注意事項及要點
同一個onEvent函數(shù)不能被注冊兩次,所以不能在一個類中注冊同時還在父類中注冊
當Post一個事件時,這個事件類的父類的事件也會被Post。
Post的事件無Subscriber處理時會Post NoSubscriberEvent事件,當調用Subscriber失敗時會Post SubscriberExceptionEvent事件。
@Subscribe(priority = 1);
public void onEvent(MessageEvent event) {
//邏輯處理
}
EventBus中還有個Util包,主要作用是可以通過AsyncExecutor執(zhí)行一個Runnable,通過內部的RunnableEx(可以搜索異常的Runnable)當Runnable拋出異常時通過EventBus發(fā)消息顯示錯誤對話框