Android消息傳遞EventBus的使用

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



    EventBus

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

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

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

ThreadMode.POSTING:默認(rèn)使用該模式,表示該方法會(huì)在當(dāng)前發(fā)布事件的線程執(zhí)行
ThreadMode.MAIN:表示會(huì)在UI線程中執(zhí)行
ThreadMode.BACKGROUND:若當(dāng)前線程非UI線程則在當(dāng)前線程中執(zhí)行,否則加入后臺(tái)任務(wù)隊(duì)列,使用線程池調(diào)用
ThreadMode.ASYNC:加入后臺(tái)任務(wù)隊(duì)列,使用線程池調(diào)用

Sticky Events使用方法

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

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

  1. 缺點(diǎn)
    無法進(jìn)程間通信,如果一個(gè)應(yīng)用內(nèi)有多個(gè)進(jìn)程的話就沒辦法了

  2. 注意事項(xiàng)及要點(diǎn)

同一個(gè)onEvent函數(shù)不能被注冊(cè)兩次,所以不能在一個(gè)類中注冊(cè)同時(shí)還在父類中注冊(cè)
當(dāng)Post一個(gè)事件時(shí),這個(gè)事件類的父類的事件也會(huì)被Post。
Post的事件無Subscriber處理時(shí)會(huì)Post NoSubscriberEvent事件,當(dāng)調(diào)用Subscriber失敗時(shí)會(huì)Post SubscriberExceptionEvent事件。

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

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

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

相關(guān)閱讀更多精彩內(nèi)容

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

友情鏈接更多精彩內(nèi)容