EventBus3.0架構(gòu)分析與手寫實(shí)現(xiàn)一

一、什么事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)容!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 介紹自己負(fù)責(zé)的部分,如何實(shí)現(xiàn)的。 自定義view viewGroup activity的啟動(dòng)流程 事件傳遞及滑動(dòng)沖...
    東經(jīng)315度閱讀 1,348評(píng)論 1 4
  • 類加載機(jī)制 如下圖所示,JVM類加載機(jī)制分為五個(gè)部分:加載,驗(yàn)證,準(zhǔn)備,解析,初始化,下面我們就分別來(lái)看一下這五個(gè)...
    舉頭望明月泣閱讀 1,253評(píng)論 0 0
  • 2.1 Activity 2.1.1 Activity的生命周期全面分析 典型情況下的生命周期:在用戶參與的情況下...
    AndroidMaster閱讀 3,280評(píng)論 0 8
  • junsuzie閱讀 259評(píng)論 0 0
  • TCD提案改善方案 姓名:黃太平 部門:三分廠 崗位:機(jī)修 提案時(shí)間: 2018 .6 . 26 ...
    黃太平閱讀 210評(píng)論 0 0

友情鏈接更多精彩內(nèi)容