好久沒更新博客了,思來想去,時(shí)隔半年又重新了回來了 最近項(xiàng)目更新想用下greenrobot的eventbus,之前都是傳統(tǒng)的Intent,Handler,Broadcast...... eventbus出現(xiàn)的很早,只是咱們的項(xiàng)目還木有用上,今天就來看看這個(gè)吧
-
官方Eventbus
官方文檔 - 啥是EventBus?
EventBus是Android下高效的發(fā)布/訂閱事件總線機(jī)制。作用是可以代替?zhèn)鹘y(tǒng)的Intent,Handler,Broadcast或接口函數(shù)在Fragment,Activity,Service,線程之間傳遞數(shù)據(jù),執(zhí)行方法。特點(diǎn)是代碼簡(jiǎn)潔,是一種發(fā)布訂閱設(shè)計(jì)模式(Publish/Subsribe),或稱作觀察者設(shè)計(jì)模式。 - 下載jar包或者直接Androidstudio里面引用
庫地址
build.gradle添加引用
compile 'org.greenrobot:eventbus:3.0.0'
-
官方圖解
EventBus
- EventBus 角色介紹
Event 傳遞的事件對(duì)象
Subscriber 事件的訂閱者
Publisher 事件的發(fā)布者
ThreadMode 定義函數(shù)在何種線程中執(zhí)行
- 定義一個(gè)事件類型
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);
}
- 注冊(cè)和解綁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,由他進(jìn)行匹配
- EventBus四種線程模式
ThreadMode.POSTING ThreadMode.MAIN ThreadMode.BACKGROUND ThreadMode.ASYNC
- 默認(rèn)模式
@Subscribe(threadMode = ThreadMode.POSTING)
public void onMessage(MessageEvent event) {
log(event.message);
}
ThreadMode.POSTING:默認(rèn)使用該模式,表示該方法會(huì)在當(dāng)前發(fā)布事件的線程執(zhí)行
ThreadMode.MAIN:表示會(huì)在UI線程中執(zhí)行
ThreadMode.BACKGROUND:若當(dāng)前線程非UI線程則在當(dāng)前線程中執(zhí)行,否則加入后臺(tái)任務(wù)隊(duì)列,使用線程池調(diào)用
ThreadMode.ASYNC:加入后臺(tái)任務(wù)隊(duì)列,使用線程池調(diào)用
Sticky Events使用方法
如果之前事件使用postSticky進(jìn)行發(fā)布且執(zhí)行過,則當(dāng)sticky為true的訂閱者再次訂閱時(shí),會(huì)去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)先級(jí))
優(yōu)先級(jí)越高越優(yōu)先執(zhí)行,默認(rèn)的優(yōu)先級(jí)為0,priority 設(shè)置優(yōu)先級(jí)別,整數(shù),數(shù)值越大優(yōu)先級(jí)別越高,則能優(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ù)重載中有一個(gè)可以指定訂閱者的優(yōu)先級(jí),我們知道EventBus中有一個(gè)事件類型到List<Subscription>的映射,在這個(gè)映射中,所有的Subscription是按priority排序的,這樣當(dāng)post事件時(shí),優(yōu)先級(jí)高的會(huì)先得到機(jī)會(huì)處理事件。
優(yōu)先級(jí)的一個(gè)應(yīng)用就事,高優(yōu)先級(jí)的事件處理函數(shù)可以終于事件的傳遞,通過cancelEventDelivery方法,但有一點(diǎn)需要注意,這個(gè)事件的ThreadMode必須是PostThread,并且只能終于它在處理的事件。
缺點(diǎn)
無法進(jìn)程間通信,如果一個(gè)應(yīng)用內(nèi)有多個(gè)進(jìn)程的話就沒辦法了注意事項(xiàng)及要點(diǎn)
同一個(gè)onEvent函數(shù)不能被注冊(cè)兩次,所以不能在一個(gè)類中注冊(cè)同時(shí)還在父類中注冊(cè)
當(dāng)Post一個(gè)事件時(shí),這個(gè)事件類的父類的事件也會(huì)被Post。
Post的事件無Subscriber處理時(shí)會(huì)Post NoSubscriberEvent事件,當(dāng)調(diào)用Subscriber失敗時(shí)會(huì)Post SubscriberExceptionEvent事件。
@Subscribe(priority = 1);
public void onEvent(MessageEvent event) {
//邏輯處理
}
EventBus中還有個(gè)Util包,主要作用是可以通過AsyncExecutor執(zhí)行一個(gè)Runnable,通過內(nèi)部的RunnableEx(可以搜索異常的Runnable)當(dāng)Runnable拋出異常時(shí)通過EventBus發(fā)消息顯示錯(cuò)誤對(duì)話框