本章通過自定義一個(gè)簡易的EventBus來了解EventBus的框架思路;
EventBus的設(shè)計(jì)思路是通過向內(nèi)存中注冊訂閱者對象和訂閱者方法并且將他們緩存起來展蒂,在Post的時(shí)候在緩存中查找厅翔,如果命中則通過反射機(jī)制調(diào)用訂閱方法達(dá)到通知的目的;
通過 自定義以下幾個(gè)步驟搀突,一共4個(gè)類來了解實(shí)際的過程
初始化:
注冊:
解綁:
Post:
反射類:
只定義1個(gè)主線程刀闷,1個(gè)后臺線程;
注解類:
注解類省掉別的參數(shù)仰迁,只定義1個(gè)線程模式甸昏;
封裝1個(gè)訂閱方法類:
MyEventBus 主類
初始化:
雙重鎖檢查生成單例模式的EventBus對象
注冊流程:
注冊的邏輯:
1:通過訂閱者對象向緩存查詢是否命中,命中返回
2:通過反射查找到訂閱者的全部訂閱方法徐许,并且緩存起來
3:查詢完本類繼續(xù) 查詢父類
1:反射查找全部方法
2:剔除非public 和static的方法
3:獲取參數(shù)施蜜,僅當(dāng)參數(shù)為1個(gè)的情況下繼續(xù)
4:獲取注解,根據(jù)注解的參數(shù)來封裝1個(gè)訂閱者方法(MySubScribeMehod)
5:訂閱者對象和訂閱者方法映射緩存在內(nèi)存中
解綁過程:
通過訂閱者查詢內(nèi)存中的訂閱者方法列表雌隅,命中則移除翻默;
Post流程:
遍歷緩存列表,通過Post的事件去查詢恰起,如果命中了修械,則將命中的方法反射調(diào)用達(dá)到通知的目的;
注:isAssignableFrom 方法是對比2和類的類信息检盼,繼承關(guān)系也可命中肯污;
反射調(diào)用的時(shí)候涉及到線程調(diào)度,接著看是如何進(jìn)行線程的調(diào)度的吨枉;
先封裝1個(gè)反射的方法
一? ?接收者要求在Main主線程
????????1:如果Post發(fā)布者是在主線程蹦渣,直接反射調(diào)用
? ? ? ? 2:如果Post發(fā)布者是在子線程,通過Handler調(diào)用貌亭,我們只需要在初始化的時(shí)定義1? ?個(gè)Handler就好
二 接收者要求在子線程
?????????1:如果Post發(fā)布者是在主線程柬唯,通過定義1個(gè)線程池,new1個(gè)線程來異步調(diào)用
? ? ? ? ?2:如果Post發(fā)布者是在子線程圃庭,則直接反射調(diào)用即可
測試結(jié)果:
說明:本篇只是學(xué)習(xí)EventBus框架學(xué)習(xí)定義的1個(gè)簡單的EventBus权逗,每個(gè)流程都簡單處理了,具體學(xué)習(xí)還要看EventBus源碼冤议;