Android EventBus解析


阿里巴巴Android開發手冊:

【強制】Activity 間的數據通信,對於數據量比較大的,避免使用 Intent + Parcelable的方式,可以考慮 EventBus 等替代方案,以免造成 TransactionTooLargeException。

基礎概念:

EventBus 是一款在Android平台發布的發布/訂閱事件總線,主要用來替代 Intent,Handler,Broadcast 在 Fragment,Activity,Service,線程之間傳遞消息,簡化各組件之間的通訊,優點開銷小,代碼優雅,能夠很好的解耦業務與界面交互,缺點是很容易混淆程序邏輯,而且無法進程間通信。
EventBus是一個Android端優化的publish/subscribe消息總線,簡化了應用程序內各組件間、組件與后台線程間的通信。比如請求網絡,等網絡返回時通過Handler或Broadcast通知UI,兩個Fragment之間需要通過Listener通信,這些需求都可以通過EventBus實現。

 

EventBus核心架構

 

從上圖我們知道,該設計采用的是設計模式中的觀察者模式。

 


EventBus的使用
EventBus的使用非常簡單,主要有3個元素:
Event:事件,可以是任意類型的對象。
Subscriber:事件訂閱者,添加一個注解@Subscribe,並且要指定線程模型(默認為POSTING),四種線程模型
Publisher:事件發布者,可以在任意線程任意位置發送事件,直接調用EventBus的post(Object)方法。

 

EventBus的四種ThreadMode(線程模型)
POSTING(默認):如果使用事件處理函數指定了線程模型為POSTING,那么該事件在哪個線程發布出來的,事件處理函數就會在這個線程中運行,也就是說發布事件和接收事件在同一個線程。在線程模型為POSTING的事件處理函數中盡量避免執行耗時操作,因為它會阻塞事件的傳遞,甚至有可能會引起ANR。
MAIN: 事件的處理會在UI線程中執行。事件處理時間不能太長,長了會ANR的。
BACKGROUND:如果事件是在UI線程中發布出來的,那么該事件處理函數就會在新的線程中運行,如果事件本來就是子線程中發布出來的,那么該事件處理函數直接在發布事件的線程中執行。在此事件處理函數中禁止進行UI更新操作。
ASYNC:無論事件在哪個線程發布,該事件處理函數都會在新建的子線程中執行,同樣,此事件處理函數中禁止進行UI更新操作。

 

EventBus使用就非常簡單了,例子網上一大堆,分為五個步驟:
1.自定義一個事件類

public class MessageEvent {
...
}

2.在需要訂閱事件的地方注冊事件

EventBus.getDefault().register(this);

3.發送事件

EventBus.getDefault().post(messageEvent);

4.處理事件

@Subscribe(threadMode = ThreadMode.MAIN)
public void XXX(MessageEvent messageEvent) {
...
}

5.取消事件訂閱

EventBus.getDefault().unregister(this);

 

2018年開通了個人微信公眾號,后面將持續在公眾號上發布技術,管理,職業規划,生活趣事等文章,歡迎關注!

 

 

參考:
Android事件總線(一)EventBus3.0用法全解析
http://blog.csdn.net/itachi85/article/details/52205464

Android進程間通信,換一種 HermesEventBus 的姿勢吧!
https://www.jianshu.com/p/f34c3336296f


免責聲明!

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



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