以下由我網上看的文章根據自己理解整理而成,感謝以下文章作者
Hongyang
http://blog.csdn.net/lmj623565791/article/details/40794879
啓艦
http://blog.csdn.net/harvic880925/article/details/40787203
github地址:https://github.com/greenrobot/EventBus
EventBus簡介:
EventBus定義:一款針對Android優化的發佈/訂閱事件總線。主要功能是替代Intent,Handler,BroadCast在Fragment,Activity,Service,線程之間傳遞消息.優點是開銷小,代碼更優雅。以及將發送者和接收者解耦。
四個部分:
- 發佈者(消息發送者)
- 訂閱者(註冊EventBus)
- 事件(消息接收)
- 總線(註銷EventBus)
A activity 跳轉到B activity 過後,B activity 發送消息給A activity ,在A activity 裏面註冊EventBus,註銷BevenBus,接受消息 ,整個過程就是這樣的
EventBus.getDefault().post("消息");//發送----->>B activity 裏面
EventBus.getDefault().register(this);//註冊------->>A activity OnCreate()方法
EventBus.getDefault().unregister(this);//註銷-------->>A activity OnDestroy()方法
接受消息的方法有四個 依次是:
onEvent()
onEventMainThread()
onEventBackgroundThread()
onEventAsync()
EventBus四個不同的消息接收處理方法:
onEvent:
使用onEvent,那麼該事件在哪個線程發佈出來的,onEvent就會在這個線程中運行,也就是說發佈事件和接收事件線程在同一個線程。使用這個方法時,在onEvent方法中不能執行耗時操作,如果執行耗時操作容易導致事件分發延遲。
onEventMainThread:
使用onEventMainThread,那麼不論事件是在哪個線程中發佈出來的,onEventMainThread都會在UI線程中執行,接收事件就會在UI線程中運行,這個在Android中是非常有用的,因爲在Android中只能在UI線程中跟新UI,所以在onEvnetMainThread方法中是不能執行耗時操作的。
onEventBackground:
使用onEventBackgrond,那麼如果事件是在UI線程中發佈出來的,那麼onEventBackground就會在子線程中運行,如果事件本來就是子線程中發佈出來的,那麼onEventBackground函數直接在該子線程中執行。
onEventAsync:
使用onEventAsync,那麼無論事件在哪個線程發佈,都會創建新的子線程在執行onEventAsync.
一 、註冊
在要接收消息的頁面註冊EventBus:
通過我們會在OnCreate()函數中註冊EventBus,在OnDestroy()函數中反註冊。所以整體的註冊與反註冊的代碼如下:
EventBus.getDefault().register(this);//訂閱事件OnCreate()函數
EventBus.getDefault().unregister(this);//註銷事件OnDestroy()函數
聲明一個類,通過這個類可以發送消息和接收消息的,(實體)
發送的消息我們發個Msg :FirstEvent("Hello EventsBus")
public class FirstEvent {
String Msg;
public FirstEvent(String msg){
this.Msg=msg;
}
public String getMsg() {
return Msg;
}
public void setMsg(String msg) {
Msg = msg;
}
}
二、發送
這裏直接點擊按鈕發送過去
btn2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
EventBus.getDefault().post(
new FirstEvent("FirstEvent btn clicked"));
}
});
//接收函數1
public void onEventMainThread(FirstEvent event) {
String msg = "onEventMainThread收到了消息:" + event.getMsg();
Log.i("msg", msg);
Toast.makeText(this, msg, Toast.LENGTH_LONG).show();
}
這裏的EventsBus 消息的發送和接受有個非常經典的總結:
當發送EventsBus 實例的消息過來的時候,消息的接收是根據參數中的類名來執行的
當然現在的EventBus 到了3.0 了 ,其實大體還是一樣的,只不過多了幾個註解而已
三、注意事項
1、註冊一般寫在onCreate或者onStart中,儘量不要寫在onResume,可能出現多次註冊,比如:
//EventBusException: Subscriber class already registered to event class
2、取消註冊一定寫在onDestory,寫在onStop可能會引發異常;
3、建議註冊前先判斷一下是否已經註冊,避免重複註冊,並且註冊儘量放在各變量初始化最後,以免造成空指針異常;
if (!EventBus.getDefault().isRegistered(this)) {
EventBus.getDefault().register(this);
}
4、3.0和之前版本不兼容,現在採用註解的方法來接收事件,四種註解方式分別爲:
1) @Subscrible 對應之前的onEvent();
2) @Subscrible(threadMode = ThreadMode.ASYNC) 對應之前的onEventAsync();
3) @Subscrible(threadMode = ThreadMode.BACKGRAND) 對應之前的onEventBackground();
4) @Subscrible(threadMode = ThreadMode.MAIN) 對應之前的onEventMainThread();
如:
@Subscribe(threadMode = ThreadMode.MAIN)
public void onEventMainThread(MessageEvent event) {
//更新UI...
}
5、採用註解後方法名沒有限制了,參數只有一個,和發送者post的參數對應配對,未聲明threadMode的時候默認線程模式是ThreadMode.POSTING,只有在該模式下才可以取消線程,否則容易導致如下異常:org.greenrobot.eventbus.EventBusException: This method may only be called from inside event handling methods on the posting thread