EventBus (發(fā)布者和訂閱者)
前言
小項(xiàng)目頁(yè)面間、線(xiàn)程間、模塊間,通信一般使用:公共變量、Intent、Handler、Broadcast,接口等等。。
當(dāng)項(xiàng)目越來(lái)越復(fù)雜時(shí),使用這些通信方式之后,代碼量大,邏輯錯(cuò)終復(fù)雜,高度耦合。為了解決這個(gè)大問(wèn)題,然后就誕生了這個(gè)框架。
官網(wǎng)示例調(diào)用代碼:
EventBus in 3 steps
-
Define events:
public static class MessageEvent { /* Additional fields if needed */ } -
Prepare subscribers: Declare and annotate your subscribing method, optionally specify a thread mode:
@Subscribe(threadMode = ThreadMode.MAIN) public void onMessageEvent(MessageEvent event) {/* Do something */};Register and unregister your subscriber. For example on Android, activities and fragments should usually register according to their life cycle:
@Override public void onStart() { super.onStart(); EventBus.getDefault().register(this); } @Override public void onStop() { super.onStop(); EventBus.getDefault().unregister(this); } -
Post events:
EventBus.getDefault().post(new MessageEvent());
自定義Event事件
訂閱者接收消息注冊(cè):EventBus.getDefault().register()(一般在onCreate中注冊(cè))
訂閱者取消訂閱注冊(cè):EventBus.getDefault().unregister();(一般在onDestory中解除注冊(cè))
發(fā)布者發(fā)送消息:EventBus.getDefault().post(event)
訂閱者接收消息:1、注解 2、主線(xiàn)程 3、event中取消息
@Subscribe(threadMode = ThreadMode.MAIN)
public void onMessageEvent(MessageEvent evnt){}
圖解:

擴(kuò)展:
onEvent:發(fā)送者在哪個(gè)線(xiàn)程發(fā)送的,該方法也在哪個(gè)線(xiàn)程中處理事件
onEventMainThread:不管發(fā)送者在哪個(gè)線(xiàn)程發(fā)送的,該方法都會(huì)在主線(xiàn)程中處理事件
onEventBackgroundThread:如果發(fā)送者是在子線(xiàn)程發(fā)送的,那么該方法也在同一個(gè)子線(xiàn)程處理事件,如果發(fā)送者是在主線(xiàn)程,那么該方法在一個(gè)線(xiàn)程池中處理事件
onEventAsync:不管發(fā)送者在哪個(gè)線(xiàn)程發(fā)送的,該方法都在線(xiàn)程池中執(zhí)行
原理:
先從注冊(cè)開(kāi)始看,
1、EventBus.getDefault().register(this);將Activity.this傳遞進(jìn)EventBus當(dāng)中,里面通過(guò)反射,獲取到包含@Subscribe 注解的函數(shù),
2、篩選onEvent開(kāi)頭的方法,獲取方法的權(quán)限修飾符,必須是public,然后獲取函數(shù)所需參數(shù)數(shù)組,
3、通過(guò)把方法名,方法形參,線(xiàn)程模型封裝成一個(gè)SubscriberMethod添加進(jìn)集合里,
3、然后遍歷集合中當(dāng)前訂閱者的所有訂閱方法,通過(guò)訂閱方法參數(shù)的字節(jié)碼,創(chuàng)建訂閱者,優(yōu)先級(jí)處理,事件類(lèi)型處理
再看Post:
1、獲取當(dāng)前線(xiàn)程的隊(duì)列,將event添加到隊(duì)列里;
2、通過(guò)event拿到事件的字節(jié)碼,注意event是支持繼承的,會(huì)獲取到事件的父類(lèi)和接口的字節(jié)碼到集合中;
3、然后通過(guò)該事件字節(jié)碼獲取所有的訂閱者。
4、根據(jù)不同的線(xiàn)程模型調(diào)用不同的方法:
通過(guò)反射調(diào)用訂閱者訂閱方法
handler發(fā)送消息
在線(xiàn)程池發(fā)送消息(包含異步或者后臺(tái)兩種)