EventBus2.0-3.0的簡單使用與詳解
EventBus是一個用於簡化Andorid、Fragment、Threads、Service之間資訊傳遞的一個釋出/訂閱事件集。
EventBus是由大名鼎鼎的greenrobot出品的一個用於Android中事件釋出/訂閱的庫。簡單點說就是用於Fragment,Activity,Service,執行緒之間進行資料傳遞,它為開發者提供除了 intent、handler、boardcast這幾種傳遞資料的方式之外的一種選擇,其優點在於 幾乎不怎麼消化資源,並且程式碼優雅簡潔。
傳統的Android元件之間的通訊方式有:Activity之間使用Intent;Service向Activity傳送broadcast;
使用EventBus的建議:
- 並不建議將應用中所有的事件都通過EventBus進行傳送,尤其對於一對一的元件之間通訊,建議不要使用EventBus。EventBus的使用場景更像是一種廣播,當我們向EventBus傳送一個事件,則該事件將會傳遞給多個該事件的訂閱者,比如Service向Activities傳送事件。跟LoacalBroadCast有點近似
- 在Activity和Fragment中使用EventBus時,要注意在元件的生命週期開始時registered EventBus,在生命週期結束時unregistered EventBus。否則容易導致OOM;
- 簡化元件之間的通訊方式
- 讓業務程式碼更加簡潔(但是需要配合相應註解進行使用)
- 可以指定事件處理方法的執行執行緒,和訂閱者的優先順序(跟廣播類似)
- 足夠的穩定,已經被很多Android應用使用。
//使用Eventbus2.0與3.0的區別
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就會在哪個執行緒接收事件。因為函式執行的執行緒不確定,這就要求使用者 最好不要執行耗時操作,可能會出現執行緒阻塞或者事件分發不及時的問題。
注意一點:方法的修飾符 最好 使用 publiconEventMainThread
對應 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); }