Android消息傳遞EventBus的使用

好久沒更新博客了,思來想去,時隔半年又重新了回來了 最近項目更新想用下greenrobot的eventbus,之前都是傳統(tǒng)的Intent,Handler,Broadcast...... eventbus出現(xiàn)的很早,只是咱們的項目還木有用上,今天就來看看這個吧
  • 官方Eventbus
    官方文檔
  • 啥是EventBus?
    EventBus是Android下高效的發(fā)布/訂閱事件總線機制。作用是可以代替?zhèn)鹘y(tǒng)的Intent,Handler,Broadcast或接口函數(shù)在Fragment,Activity,Service,線程之間傳遞數(shù)據(jù),執(zhí)行方法。特點是代碼簡潔,是一種發(fā)布訂閱設計模式(Publish/Subsribe),或稱作觀察者設計模式。
  • 下載jar包或者直接Androidstudio里面引用
    庫地址
build.gradle添加引用
compile 'org.greenrobot:eventbus:3.0.0'
  • 官方圖解



    EventBus

  • EventBus 角色介紹
 Event        傳遞的事件對象
 Subscriber   事件的訂閱者 
 Publisher    事件的發(fā)布者
 ThreadMode   定義函數(shù)在何種線程中執(zhí)行
  1. 定義一個事件類型
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);  
} 
  • 注冊和解綁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,由他進行匹配
  • EventBus四種線程模式

ThreadMode.POSTING ThreadMode.MAIN ThreadMode.BACKGROUND ThreadMode.ASYNC

  1. 默認模式
@Subscribe(threadMode = ThreadMode.POSTING)   
public void onMessage(MessageEvent event) {  
    log(event.message);  
}  

ThreadMode.POSTING:默認使用該模式,表示該方法會在當前發(fā)布事件的線程執(zhí)行
ThreadMode.MAIN:表示會在UI線程中執(zhí)行
ThreadMode.BACKGROUND:若當前線程非UI線程則在當前線程中執(zhí)行,否則加入后臺任務隊列,使用線程池調用
ThreadMode.ASYNC:加入后臺任務隊列,使用線程池調用

Sticky Events使用方法

如果之前事件使用postSticky進行發(fā)布且執(zhí)行過,則當sticky為true的訂閱者再次訂閱時,會去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)先級)
優(yōu)先級越高越優(yōu)先執(zhí)行,默認的優(yōu)先級為0,priority 設置優(yōu)先級別,整數(shù),數(shù)值越大優(yōu)先級別越高,則能優(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ù)重載中有一個可以指定訂閱者的優(yōu)先級,我們知道EventBus中有一個事件類型到List<Subscription>的映射,在這個映射中,所有的Subscription是按priority排序的,這樣當post事件時,優(yōu)先級高的會先得到機會處理事件。

優(yōu)先級的一個應用就事,高優(yōu)先級的事件處理函數(shù)可以終于事件的傳遞,通過cancelEventDelivery方法,但有一點需要注意,這個事件的ThreadMode必須是PostThread,并且只能終于它在處理的事件。

  1. 缺點
    無法進程間通信,如果一個應用內有多個進程的話就沒辦法了

  2. 注意事項及要點

同一個onEvent函數(shù)不能被注冊兩次,所以不能在一個類中注冊同時還在父類中注冊
當Post一個事件時,這個事件類的父類的事件也會被Post。
Post的事件無Subscriber處理時會Post NoSubscriberEvent事件,當調用Subscriber失敗時會Post SubscriberExceptionEvent事件。

@Subscribe(priority = 1);  
public void onEvent(MessageEvent event) {  
    //邏輯處理
}  

EventBus中還有個Util包,主要作用是可以通過AsyncExecutor執(zhí)行一個Runnable,通過內部的RunnableEx(可以搜索異常的Runnable)當Runnable拋出異常時通過EventBus發(fā)消息顯示錯誤對話框

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • 項目到了一定階段會出現(xiàn)一種甜蜜的負擔:業(yè)務的不斷發(fā)展與人員的流動性越來越大,代碼維護與測試回歸流程越來越繁瑣。這個...
    fdacc6a1e764閱讀 3,342評論 0 6
  • 一、簡介 EventBus是由greenrobot 組織貢獻的一個Android事件發(fā)布/訂閱輕量級框架。Even...
    Mr丶sorrow閱讀 15,431評論 0 13
  • 原文鏈接:http://blog.csdn.net/u012810020/article/details/7005...
    tinyjoy閱讀 669評論 1 5
  • 先吐槽一下博客園的MarkDown編輯器,推出的時候還很高興博客園支持MarkDown了,試用了下發(fā)現(xiàn)支持不完善就...
    Ten_Minutes閱讀 667評論 0 2
  • 【養(yǎng)生篇】其實養(yǎng)生不難,我們不需要學很多深奧的醫(yī)學知識,我們只需懂得一些生理上的常識,比如飯不要吃得十分飽,太飽了...
    晨曦_邱月暉閱讀 321評論 0 0

友情鏈接更多精彩內容