EventBus3 簡單使用及注意點


博客: 安卓之家
微博: 追風917
CSDN: 蔣朋的家
簡書: 追風917

每日一景

EventBus3 簡介


EventBus Android 發布/訂閱事件總線,可簡化 Activities, Fragments, Threads, Services 等組件間的消息傳遞,可替代 Intent, Handler, BroadCast ,接口等傳統方案,更快,代碼更小,50K 左右的 jar 包,代碼更優雅,徹底解耦。EventBus3 是最新版本,官網地址:

https://github.com/greenrobot/EventBus

使用


這里簡單介紹下使用方法:

1 添加依賴 compile 'org.greenrobot:eventbus:3.0.0'

2 編寫事件類

3 post 發布事件

這里有直接發布和滯留發布

//直接發布
EventBus.getDefault().post("直接發布");
//滯留發布
EventBus.getDefault().postSticky("滯留發布");

注意可以發布的是一個 Object 類,發送什么,訂閱者就會接收什么。

此處要注意兩個地方:

  1. 如果 post 字節數據,此時訂閱者的方法里參數需為 Byte,而不是 byte,同樣的,post int數據,訂閱方法參數需為 Interger,其他基本數據類型同理

  2. 如果 post 字符串,那么所有方法的參數是 String 類型的訂閱者都會接收到事件而執行方法。

4 訂閱者接收事件

訂閱的時候要注冊和取消注冊。

注冊一般是在 onCreateonStart 里注冊,盡量不要在 onResume,可能出現多次注冊的情況,比如下面這個異常::

EventBusException: Subscriber class already registered to event class

可以先判斷下:

    if (!EventBus.getDefault().isRegistered(this)) {
        EventBus.getDefault().register(this);
    }

參看這里:GreenRobot EventBusException: Subscriber class already registered to event class

取消注冊 要寫到 onDestroy 方法里,不要寫到 onStop 里,有時會出現異常的哦

EventBus 3 和之前版本的 EventBus 不兼容,這里采用注解的方法來接收事件,四種注解 @Subscrible@Subscrible(threadMode = ThreadMode.ASYNC)@Subscribe(threadMode = ThreadMode.BACKGROUND)@Subscribe(threadMode = ThreadMode.MAIN) 分別對應之前的 onEvent()onEventAsync()onEventBackground()onEventMainThread()

EventBus 3 采用注解后,方法名沒有限制了,參數只有一個,和發送者 post 的參數對應配對,在未聲明 threadMode 時,默認的線程模式為 ThreadMode.POSTING,只有在該模式下才可以取消線程,否則容易導致如下異常:

org.greenrobot.eventbus.EventBusException: This method may only be called from inside event handling methods on the posting thread

由於可在任何地方都可以 post 一個事件,那么在不同線程之間傳遞事件,比如在工作線程傳遞一個事件更新UI線程中的一個控件,則需要注意 threadMode 的切換。

好了,基本使用大概就這些,后面遇到會補充...

2016.07.13補充:

今天遇到了訂閱事件無法執行的情況,分析后發現是訂閱事件的 Activity 還未執行的原因。

找到原因就好辦了,這時候就需要用到 postSticky

發布事件時用 postSticky 操作:

EventBus.getDefault().postSticky(event);

訂閱時,添加 sticky = true

@Subscribe(sticky = true)    //看下 `@Subscribe` 源碼知道 `sticky` 默認是 `false`
public void onEvent(Event e) { 
    ---
}  

這里也有個坑,就是 EventBus.getDefault().register(this); 注冊時最好放到各變量初始化最后,否則可能會出現一些變量空指針異常。

混淆


沒什么說的,復制下面代碼到你的混淆文件即可:

-keepattributes *Annotation*
-keepclassmembers class ** {    
    @org.greenrobot.eventbus.Subscribe <methods>;
}
-keep enum org.greenrobot.eventbus.ThreadMode { 
      *; 
}
# Only required if you use AsyncExecutor
-keepclassmembers class * extends org.greenrobot.eventbus.util.ThrowableFailureEvent {    
    <init>(java.lang.Throwable);
}

發布的事件多了以后,我們很難去管理,下面推薦個 AS 插件:

https://github.com/kgmyshin/eventbus3-intellij-plugin

更多 AS 插件請訪問:https://github.com/jp1017/AndroidStudioPlugins

欲知更多 EventBus 的內容,還可參考:

EventBus3新特性及用法
EventBus 源碼解析
Android EventBus源碼解析 帶你深入理解EventBus

最后,非常感謝您的閱讀,有任何疑問,可以后面評論,謝謝!

神奇的安卓開發網站:http://androidcat.com/

安卓開源庫收集整理:https://github.com/XXApple/AndroidLibs

分享是一種美德,更是一種生活方式!!

也許你會說我是一個夢想者,但我不是唯一的一個。

悅分享,越快樂_

歡迎交流,轉載請注明出處,謝謝!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM