1. 程式人生 > >EventBus2.0-3.0的簡單使用與詳解

EventBus2.0-3.0的簡單使用與詳解

EventBus是一個用於簡化Andorid、Fragment、Threads、Service之間資訊傳遞的一個釋出/訂閱事件集。

EventBus是由大名鼎鼎的greenrobot出品的一個用於Android中事件釋出/訂閱的庫。簡單點說就是用於Fragment,Activity,Service,執行緒之間進行資料傳遞,它為開發者提供除了 intent、handler、boardcast這幾種傳遞資料的方式之外的一種選擇,其優點在於 幾乎不怎麼消化資源,並且程式碼優雅簡潔。

傳統的Android元件之間的通訊方式有:Activity之間使用Intent;Service向Activity傳送broadcast;

Fragment和Activity之間相互持有對方的引用(隨後可以呼叫對方的相關方法進行事件傳遞)。傳統的事件傳遞的問題在於:通訊方式沒有實現解耦,是硬編碼在元件中的。元件一旦發生修改,對應的通訊方式就需要跟著修改。其實不管什麼場景下,我們最好能夠使得自己編寫的程式碼最大限度的解耦,這是一個很好的習慣,避免無用功,提高程式碼利用率

使用EventBus的建議:

  • 並不建議將應用中所有的事件都通過EventBus進行傳送,尤其對於一對一的元件之間通訊,建議不要使用EventBus。EventBus的使用場景更像是一種廣播,當我們向EventBus傳送一個事件,則該事件將會傳遞給多個該事件的訂閱者,比如Service向Activities傳送事件。跟LoacalBroadCast有點近似
  • 在Activity和Fragment中使用EventBus時,要注意在元件的生命週期開始時registered EventBus,在生命週期結束時unregistered EventBus。否則容易導致OOM;
  使用EventBus的好處在於:
  • 簡化元件之間的通訊方式
  • 讓業務程式碼更加簡潔(但是需要配合相應註解進行使用)
  • 可以指定事件處理方法的執行執行緒,和訂閱者的優先順序(跟廣播類似)
  • 足夠的穩定,已經被很多Android應用使用。

//使用Eventbus2.0與3.0的區別

EventBus 2.x 必須定義以onEvent開頭的幾個方法,程式碼中語境比較突兀,且有可能會導致拼寫錯誤,例如資料同步事件

EventBus  3.0 函式名字不再受到許可權,而且可以在一個函式中體現出在哪個執行緒執行,並且可指定接收事件的優先順序

EventBus 2.x 註冊方式也比較繁瑣。EventBus  3.0 註冊方式只有一個

EventBus 2.x 是採用反射的方式對整個註冊的類的所有方法進行掃描來完成註冊,當然會有效能上的影響。EventBus  3.0中EventBus提供了EventBusAnnotationProcessor註解處理器來在編譯期通過讀取@Subscribe()註解並解析、處理其中所包含的資訊,然後生成java類來儲存所有訂閱者關於訂閱的資訊,這樣就比在執行時使用反射來獲得這些訂閱者的資訊速度要快

EventBus 四個Subscriber

首先在將四種方式之前不得不說一下ThreadMode, ThreadMode 是EventBus中一個很重要的概念,其本身是一個enum,他同樣提供了四個預設屬性值:Async,BackgroundThread,MainThread,PostThread;而在3.0中則改為ASYNC,BACKGROUND,MAIN,POSTING。分別對應四個方法。

onEvent
對應 PostThread,當使用onEvent作為訂閱函式時,釋出者在哪個執行緒釋出事件,onEvent就會在哪個執行緒接收事件。因為函式執行的執行緒不確定,這就要求使用者 最好不要執行耗時操作,可能會出現執行緒阻塞或者事件分發不及時的問題。
注意一點:
方法的修飾符 最好 使用 public

onEventMainThread
對應 MainThread,當使用onEventMainThread作為訂閱函式時,釋出者不管在哪個執行緒釋出事件,onEventMainThread都會在主執行緒接收事件。這就要求使用者 一定不要執行耗時操作,不然會造成執行緒阻塞。

onEventBackground
對應 BackgroundThread,當使用onEventBackground作為訂閱函式時,釋出者如果在主執行緒釋出事件,onEventBackground將會新開一個子執行緒並接收事件,但是如果是在子執行緒中釋出事件,onEventBackground將會直接在該子執行緒中接受事件。

onEventAsync
對應 Async,當使用onEventAsync作為訂閱函式時,釋出者無論在哪個執行緒釋出事件,onEventAsync都會新開一個子執行緒並接收事件。

而相對來說,3.0 改變對需要固定函式名的設定,提供了一種新的形式,改用註解@Subscribe ,在使用中更加靈活,而且 這裡 ThreadMode 將被直接使用。EventBus 並沒有摒棄固定函式名的形式,開發者仍舊可以使用這種形式,不過在使用過程中必須要 添加註解 @ Subscribe 但不用指定ThreadMode

先談談EventsBus2.0的基本使用

//匯入依賴

compile 'org.greenrobot:eventbus:3.0.0'

provided 'org.glassfish:javax.annotation:10.0-b28'//解決獲取不到@Subscribe註解的問題

//註冊EventBus

//註冊Eventsbus
EventBus.getDefault().register(this);
//定義點選事件
//點選跳轉
@OnClick(R.id.button_jump)
public void onViewClicked() {
Intent intent = new Intent(MainActivity.this, Main_jump.class);
startActivity(intent);
}
//跳轉過去新的Activity.設定點選事件,釋出事件
@OnClick(R.id.button_send)
//傳送的點選事件
public void onViewClicked() {
EventBus.getDefault().post(new MessageEvent("今天學習的Eventbus,受益匪淺,需要繼續努力。強化自己"));
finish();
}
//在MainActivity獲取釋出的訊息
//接受訊息
public void onEventMainThread(MessageEvent message){
//獲取訊息
String s = message.getMsg();
textName.setText(s);
}
//登出訂閱。在生命週期結束時unregistered EventBus。否則容易導致OOM;
@Override
protected void onDestroy() {
super.onDestroy();
//反註冊
EventBus.getDefault().unregister(this);
}
EventsBus3.0的基本使用

3.0 改變對需要固定函式名的設定,提供了一種新的形式,改用註解@Subscribe ,在使用中更加靈活,而且 這裡 ThreadMode 將被直接使用。

ThreadMode總共四個:

NAIN UI主執行緒

BACKGROUND 後臺執行緒

POSTING 和釋出者處在同一個執行緒

ASYNC 非同步執行緒

//註冊EventBus
EventBus.getDefault().register(this);
//點選事件
@OnClick(R.id.button_jump)
public void onViewClicked() {
Intent intent=new Intent(MainActivity.this,Mainjump.class);
startActivity(intent);
}
//點選事件
public void onViewClicked() {
//傳送訊息
EventBus.getDefault().post(new Bean("xxx"));
finish();
}
@Subscribe(threadMode = ThreadMode.MAIN)
public void messageEvent(Bean bean){
//獲取訊息
String s = bean.getName();
textName.setText(s);
}
@Override
//登出
protected void onDestroy() {
super.onDestroy();
EventBus.getDefault().unregister(this);
}