目錄:
1.1 EventBus的實現原理
1.2 EventBus的基本使用
1.3 EventBus的ThreadMode
1.4 當前常用的事件總線對比
EventBus 原理解析
用LiveEventBus替代RxBus芦劣、EventBus
LiveEventBus的使用
【侵權刪】
1.1 EventBus的實現原理
EventBus
是一種基于觀察者模式的發(fā)布/訂閱事件總線框架
EventBus的注冊,通過反射
的方式獲取到觀察者的事件、方法辩蛋、所在線程。
以事件類型為key鍵將這些信息存入到Map中拆檬。
事件發(fā)布者將事件通過post方法發(fā)送到EventBus中约素,EventBus將指定的事件分發(fā)給訂閱者。
EventBus使用Subscribe注解
可以指定threadMode,sticky,priority
EventBus.getDefault()
是一個單例方法
可以通過配置EventBusBuilder來更改EventBus的屬性
1.2 使用:
注冊: EventBus.getDefault().register(this);
注銷:EventBus.getDefault().unregister(this);
定義事件:普通類贝攒,變量+載入變量的構造函數
發(fā)送事件:構造事件并發(fā)送:EventBus.getDefault().post();
接收事件:添加注解Subscribe盗誊,指定線程,參數是事件
@Subscribe(threadMode = ThreadMode.MAIN)
public void onReceiveEvent(AEventModel aEvent) {
}
其他方法:
判斷是否已經注冊:EventBus.getDefault().isRegistered(this)
完整案例:
// 注冊:
private void initEventBus() {
if (!EventBus.getDefault().isRegistered(this)) {
EventBus.getDefault().register(this);
}
}
// 注銷:
@Override
protected void onStop() {
super.onStop();
if (isFinishing()&&EventBus.getDefault()
.isRegistered(this)) {
EventBus.getDefault().unregister(this);
}
}
// 發(fā)送
AEvent aEvent = new AEvent("1", msgId);
EventBus.getDefault().post(aEvent);
// 接收
@Subscribe(threadMode = ThreadMode.MAIN)
public void onReceiveEvent(AEvent event) {
...
}
1.3 EventBus的ThreadMode
線程模式 決定了在當前線程線程發(fā)送事件后是在當前線程
接收處理事件隘弊,還是回到主線程
處理事件哈踱,亦或是新開一個線程
處理事件。
EventBus提供了五種線程模式:
-
ThreadMode.POSTING长捧,
posting
默認的線程模式嚣鄙,在哪個線程發(fā)送事件就在對應線程處理事件,避免了線程切換串结,效率高。 -
ThreadMode.MAIN,
main
如在主線程(UI線程)發(fā)送事件肌割,則直接在主線程處理事件卧蜓;如果在子線程發(fā)送事件,則先將事件列入隊列把敞,然后通過 Handler 切換到主線程弥奸,依次處理事件。 -
ThreadMode.MAIN_ORDERED奋早,
main_ordered
無論在哪個線程發(fā)送事件盛霎,都先將事件列入隊列,然后通過 Handler 切換到主線程耽装,依次處理事件愤炸。 -
ThreadMode.BACKGROUND,
background
如果在主線程發(fā)送事件掉奄,則先將事件列入隊列规个,然后通過線程池依次處理事件;如果在子線程發(fā)送事件姓建,則直接在發(fā)送事件的線程處理事件诞仓。 -
ThreadMode.ASYNC,
async
無論在哪個線程發(fā)送事件速兔,都將事件列入隊列墅拭,然后通過線程池處理。
1.4 當前常用的事件總線對比
為什么要用
LiveEventBus
能感知生命周期
1 消息隨時訂閱涣狗,自動取消訂閱
2 告別內存泄漏
3 告別生命周期造成的崩潰支持跨進程帜矾、跨APP消息發(fā)送
1 進程內通信
2 APP內跨進程通信
3 APP間通信還有其他更多特性
1 免配置直接使用,方便快捷
2 支持粘性消息Sticky
3 支持AndroidX
4 支持延遲發(fā)送
5 觀察者支持多種接收模式(全生命周期/激活狀態(tài)可接受消息)