一、什麼是事件總線?
它是針對Android中的四大組件Activity,Service,BroadcastReceiver和ContentProvider之間實現的統一的訂閱、發佈,以實現它們之間的進程通信。其原理是採用了觀察者模式的開發機制。
二、常用的事件總線框架
EventBus和Otto
EventBus的基本使用官方參考:https://github.com/greenrobot/EventBus
Otto的基本使用官方參考:http://square.github.io/otto/
三、EventBus的使用
1.在build.gradle中添加依賴庫
dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
testCompile 'junit:junit:4.12'
compile 'org.greenrobot:eventbus:3.0.0'
}
2.註冊和反註冊
一般在Activity或者Fragment中的onCreat方法中進行註冊,在onDestroy中進行反註冊。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
EventBus.getDefault().register(this);
}
@Override
protected void onDestroy() {
super.onDestroy();
EventBus.getDefault().unregister(this);
}
3.訂閱者
類似廣播,但是有別於2.4版本,你不必再去約定OnEvent方法開頭了(看不懂沒關係),在3.0版本之後訂閱者有四種形式(就是四種線程模式)的接收方式:
ThreadMode.MAIN:如果線程模式是MAIN,那麼無論事件是在什麼線程發送出來的,該事件處理函數都會在UI線程中執行,可以用來更新UI,但是注意不要做耗時操作。
ThreadMode.POSTING:如果訂閱者在使用事件處理函數時候指定了這種線程模式,那麼該事件是在哪個線程發佈出來的,那麼處理函數就會在這個線程中執行,也就是說發佈事件和接收事件是在同一個線程。在這種線程模式下儘量避免做耗時操作,因爲會阻塞事件的傳遞,很有可能引起ANR。
ThreadMode.ASYNC:這種線程模式就是說,無論事件在哪個線程發佈,該事件的處理函數都會在新建的子線程中執行,此事件處理函數中是不能進行UI操作的。
ThreadMode.BACKGROUND:這種線程模式意思是,如果事件是在UI線程中發佈出來的,那麼該事件處理函數就會在子線程中執行;如果事件是在子線程中發佈的,那就還在這個線程中處理。在這種模式下是不能更新UI操作的。
個人覺得第一種比較常用,後面三種用的頻率很低。
@Subscribe(threadMode = ThreadMode.MAIN)
public void receiveEventBus(MessageEvent
event) {
Log.v(TAG, "EventBus is running" + event.getMessage());
//在此執行你要進行的操作(更新UI,接收消息等)
}
使用了@Subscribe註解,其含義爲訂閱者,在其內傳入了threadMode,我們定義爲ThreadMode.MainThread, 其含義爲該方法在UI線程完成,這樣你就不要擔心拋出異常啦。receiveEventBus 是一個函數名,你自己可 以任意定義。
4.發佈者
發佈者可以在你程序的任意位置進行發佈,當它執行之後,訂閱者回立即收到消息,並進行處理。
EventBus.getDefault().post(new MessageEvent ());或者EventBus.getDefault().post(new MessageEvent (msg));
由於我們的post可能是一個對象,所以我們需要定義一個class類MessageEvent.java
public class MessageEvent {
private String msg;
public PersonEvent() {
}
public PersonEvent(String msg) {
msg = msg;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
}
好了,到這裏EventBus事件總線就完成了,趕快去嘗試一下能否正常運行吧!
如果您覺得對你有用,請幫我頂一頂。