
Talk is cheap. Show me the code
前言
最近幾年,很多優(yōu)秀的第三方開源代碼出現(xiàn)在我們的眼前,為 app 的開發(fā)提供了極大的便利,同時也降低了開發(fā)的門檻?,F(xiàn)在拿幾個框架組合下,再加上幾個開源庫,一個簡單的 app 就出來了。所以在很多的簡歷中,我們總是能找到這樣的描述:
熟悉 xxx 框架,熟練運用第三方 xxx 開源庫
這個系列,旨在介紹如何運用開源庫的基礎上,對這些開源庫進行講解。
由于一般流行的開源庫更新的速度都不慢,所以我們這次選取的一般是他最簡的版本。但是簡單歸簡單,核心思想還是要有的。相信大家在掌握了核心的思想后,一些旁枝末節(jié)就可以順理成章的理解了。
我們很多的時候往往是只見森林不見樹。對于一些幾千行甚至幾萬行代碼的開源庫不知道從何下手,這時候不如想想是不是可以把不必要的部分先去掉,留下核心的部分,這樣理解起來相對就簡單對了。而且只要掌握了核心的部分,其他的部分理解起來相對就容易多了。
好了,不多說,這次我們先拿 eventbus 開刀。
什么是EventBus
我們在開發(fā)的過程中,免不了需要在各個頁面間傳遞消息。除了最先想到的 Android 四大組件之一的 broadcast 之外,EventBus 應該是我們目前使用最多的通信模塊了。如果你沒有使用過 EventBus,那么使用廣播可能覺得還行,但是一旦你使用過 EventBus,就會覺得使用廣播相對來說比較麻煩而且效率也不高。
EventBus 大大的簡化了應用程序內(nèi)部各組件間,組件和后臺線程之間的通信。所以最近一年 EventBus 非常流行,甚至到了濫用的地步。
好了,廢話不多說,直接上代碼。
最新的 EventBus 的 release 版本為 V3.0.0。但是為了竟可能簡單的抓住 EventBus 的核心思想,本文以 V1.0.1 版本為基礎,再次進行了削減,力求以最少的代碼展示最核心的內(nèi)容。其他的無非是在核心功能上做的擴展。
demo 工程很簡單,總共只有 4 個 java 文件,但是用來說明核心原理已經(jīng)足夠了,其中核心的類是 EventBusLite。

如何使用
定義事件類
這里直接使用 AnyEvent 作為任意事件的代表。

注冊訂閱事件
如下所示,這里使用 register 方法進行訂閱事件的注冊,區(qū)別的地方在于增加了一個 callbackMethodName 的參數(shù),用于指定接收到事件后的處理方法,這塊再后面的源碼解析中會講到。

發(fā)送訂閱事件
直接調(diào)用 post 方法,不再贅述。

源碼解析
構(gòu)造方法
采用的是最簡單的單例模式。

注冊方法
這里對 register 函數(shù)進行了改造,第二個參數(shù)在源代碼中是沒有的,onEvent 方法在源代碼中是直接以靜態(tài)字符串的形式存在的,這里為了大家便于理解和調(diào)試,所以單獨提取出來作為一個入?yún)ⅰ?/p>
但是這個參數(shù)不是隨便寫的,eventbuslite 中會通過反射機制查找當前注冊的類中是否存在該名稱所對應的方法。

找到訂閱方法
findSubscriberMethods 方法找出一個 subscriberMethods 的集合。也就是傳進來的訂閱者的訂閱方法,然后遍歷訂閱者中存在的方法,找到匹配后加入到集合中去。
事件的對象為了方便,代碼中直接寫死去方法中的第一個參數(shù)。
下面就來查看該方法的具體實現(xiàn):

開始訂閱
subscribe 方法會根據(jù) subscriber 訂閱者和 subscriberMethod 訂閱方法創(chuàng)建一個 Subscription 訂閱對象,對象中存放的是訂閱者和訂閱方法。
subscriptionsByEventClass 講事件和訂閱對象結(jié)合起來。

搜索訂閱事件
findEventClasses 通過事件找到訂閱者。

發(fā)送事件
根據(jù)事件查找所有的訂閱者,并將事件分發(fā)給他們。

好了,算是流水賬式的記了一遍。就像我開頭提到的:Talk is cheap. Show me the code。
要理解其中的實現(xiàn)原理,還是直接看源碼吧。覺得好的順便 star 下。