一、什么事EventBus?
EventBus是一個(gè)Android端優(yōu)化的publish/subscribe消息事件總線。
EventBus簡(jiǎn)化了應(yīng)用程序內(nèi)各組件間、組件與后臺(tái)線程間的通信。
EventBus適用于項(xiàng)目的任何地方,主線程與子線程。
EventBus只能支持一個(gè)參數(shù)的消息傳遞!!!
但是官方的EventBus不能實(shí)現(xiàn)跨進(jìn)程。這篇文章將手寫一個(gè)EventBus并能實(shí)現(xiàn)跨進(jìn)程。
二、目前通信方式的弊端分析:
1.設(shè)置接口通信;這種方式的適用性比較狹窄,會(huì)造成業(yè)務(wù)代碼的耦合,接口不支持跨線程;
2.通過(guò)Handler:處理消息必須實(shí)例化一個(gè)Handler,也就是說(shuō)必須持有Handler的引用,并且處理消息必須在handlerMessage方法里面,Handler支持跨線程;
3.通過(guò)BroadCast:不安全(凡是注冊(cè)了Action都能收到),處理消息是在onReceiver,這個(gè)是主線程,因此不能處理非常多的耗時(shí)操作。BroadCast支持跨進(jìn)程。
三、手寫EventBus步驟:
在手寫之前,我們先要了解EventBus本身的結(jié)構(gòu)是什么樣子的,此時(shí)我再用個(gè)現(xiàn)實(shí)中的例子來(lái)說(shuō)明:大家都使用過(guò)Boss直聘(或者其他的招聘網(wǎng)站)找過(guò)工作,招聘網(wǎng)站里面有各種各樣的公司急招的崗位,比如說(shuō)我想通過(guò)boss直聘去找阿里公司的Android開(kāi)發(fā)工程師的崗位,那么阿里公司首先要將自己需要的崗位信息提供給boss直聘,boss直聘也肯定不止有阿里這一家公司的崗位招聘信息,所以boss直聘里面肯定會(huì)有一張大的表格,記錄著很多家公司的崗位信息,我這是通過(guò)Android這個(gè)關(guān)鍵字去boss直聘網(wǎng)站上進(jìn)行搜索,就搜索到了一大把Android相關(guān)的崗位,這里的三個(gè)角色我-->發(fā)送消息;boss直聘-->EventBus中轉(zhuǎn)站;阿里巴巴-->具體接收消息,“Android”這個(gè)搜索關(guān)鍵字就是“事件”;
3.1角色定位Subscribe
image.png
EventBus注解必不可少,用它來(lái)注解函數(shù),指明這個(gè)函數(shù)具備接受消息的能力,ThreadMode表示接受消息的線程類型。
3.2角色定位SubscribeMethod
SubscribeMethod就相當(dāng)于故事中的阿里公司提供的職位,這個(gè)”職位“有三個(gè)成員變量,分別是Method、ThreadMode、Class<?>
image.png
3.3角色定位EventBus
故事中提到EventBus相當(dāng)于Boss直聘網(wǎng)站,它里面定義了一張總表,用來(lái)存儲(chǔ)各家公司里面的各個(gè)崗位信息。
image.png
首先它有注冊(cè)方法,注冊(cè)就是將Class類中所有被Subscribe注解過(guò)的函數(shù)保存起來(lái):
image.png
image.png
再者它有pos方法,就是傳入一個(gè)Object的對(duì)象,然后發(fā)送出去:
image.png
四、手寫的EventBus如何線程切換?
ThreadMode定義了接收方法是主線程還是子線程,但是如果執(zhí)行post發(fā)送方法是在子線程,那如何處理呢?
處理大綱:
1.post發(fā)送方法在子線程---》接收方法在主線程:用Handler處理;
2.post發(fā)送方法在主線程---》接收方法在子線程:用線程池ExectuorService切換;
image.png
五、改造EventBus能支持跨進(jìn)程通信
序列化與反序列化
Parcelable:Android層面,性能更高
Serviserble:Java層面,雖然簡(jiǎn)單,影響性能
Binder 和Parcal關(guān)系
Binder直接跟Native打交道
Binder相當(dāng)于船,貨物就相當(dāng)于Parcal
實(shí)現(xiàn)EventBus跨進(jìn)程通信需要結(jié)合AIDL,打比方說(shuō)B進(jìn)程想要調(diào)用A進(jìn)程的EventBus.getDefault().post()方法去發(fā)送,但是兩個(gè)進(jìn)程間單例不再是有效的單例,數(shù)據(jù)也無(wú)法跨進(jìn)程傳輸,但是Android層提供了Parcelable跨進(jìn)程傳輸?shù)膶?duì)象,我們先定義兩個(gè)parcelable的aidl文件(Request和Responce),然后創(chuàng)建兩個(gè)類繼承Parcelable(還是Request和Responce),我們通過(guò)這兩個(gè)對(duì)象的傳入傳出操作,就能實(shí)現(xiàn)跨進(jìn)程通信:
image.png
接下來(lái)請(qǐng)看下一章節(jié)內(nèi)容!







