阿里巴巴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