android架構師之路 模仿eventbus

2021-09-24 22:29:15 字數 2961 閱讀 9534

1、eventbus簡介

eventbus是android事件發布-訂閱匯流排,簡化了活動片段、執行緒、服務等之間的通訊,**更少,質量更好,可以避免由於使用廣播通訊而帶來的諸多不便。具體使用可以參考:我這裡主要是簡單講解eventbus的**邏輯思想,以及自己簡單實現乙個eventbus

2、subscribe 介紹

@subscribe採用執行時註解,且註解只能用在函式上,預設的threadmode為posting

3、threadmode介紹

posting

預設的模式,開銷最小的模式,因為宣告為posting的訂閱者會在發布的同乙個執行緒呼叫,發布者在主線程那麼訂閱者也就在主線程,反之亦,避免了執行緒切換,如果不確定是否有耗時操作,謹慎使用,因為可能是在主線程發布

main

主線程呼叫,視發布執行緒不同處理不同,如果發布者在主線程那麼直接呼叫(非阻塞式),如果發布者不在主線程那麼阻塞式呼叫

main_ordered

和main差不多,主線程呼叫,和main不同的是他保證了post是非阻塞式的(預設走main的非主線程的邏輯,所以可以做到非阻塞)

background

在子執行緒呼叫,如果發布在子執行緒那麼直接在發布執行緒呼叫,如果發布在主線程那麼將開啟乙個子執行緒來呼叫,這個子執行緒是阻塞式的,按順序交付所有事件,所以也不適合做耗時任務,因為多個事件共用這乙個後台執行緒

async

在子執行緒呼叫,總是開啟乙個新的執行緒來呼叫,適用於做耗時任務,比如資料庫操作,網路請求等,不適合做計算任務,會導致開啟大量執行緒

4、register介紹

通過getdefault獲取eventbus例項,這是一條預設的事件匯流排,通過單例模式實現,其建構函式是public的也可以通過new的形式來建立多條事件匯流排

register方法 

/**

* 註冊

*/public void register(object subscriber)

}

getsubscriblemethods方法

/**

* 遍歷接收事件的方法

** @param subscriber

* @return

*/private listgetsubscriblemethods(object subscriber)

//物件表示的類或介面宣告的所有方法

method declaredmethods = aclass.getdeclaredmethods();

for (method declaredmethod : declaredmethods)

//獲得方法引數型別

class> parametertypes = declaredmethod.getparametertypes();

//eventbus 是能有乙個引數

if (parametertypes.length != 1)

//符合要求的

threadmode threadmode = annotation.threadmode();

subscriblemethod subscriblemethod = new subscriblemethod(declaredmethod,threadmode,parametertypes[0]);

list.add(subscriblemethod);

}//獲取父類 activity---->baseactivity----->

aclass = aclass.getsuperclass();

}return list;

}

5、post簡介

我這裡就只處理了main、async、posting執行緒之間的切換,遍歷前面register的activity中的所有@subscribe方法,在post方法中根據threadmode執行緒來切換相應的執行緒

* 傳送資料

* @param obj

*/public void post(final object obj) else

});}

break;

//接收方法在子執行緒種情況

case async:

//post方法執行在主線程中

if(looper.mylooper() == looper.getmainlooper())

});} else

break;

case posting:

break;}}}}}

/**

* 執行方法

* @param subscriblemethod

* @param next

* @param obj

*/private void invoke(subscriblemethod subscriblemethod, object next, object obj) catch (illegalacces***ception e) catch (invocationtargetexception e)

}

6、unregister方法

/**

* 取消註冊

*/public void unregister(object subscriber)

}

架構師之路

隨著經驗能力的增長,程式的程式設計習慣也在發生著改變,以下是我個人程式設計習慣的改變。1級 思考一段時間,寫一段 2級 用圖形幫助思考,然後寫 3級 將思考過程寫成注釋,然後再寫 4級 用圖形幫助思考,然後一邊寫注釋,一邊寫 5級 思考過程中增加對不確定技術點的測試。6級 將思考過程寫在記事本裡,將...

架構師之路

方 秒殺系統架構優化思路 分布式id生成器 網際網路架構,如何進行容量設計 執行緒數究竟設多少合理 單點系統架構的可用性與效能優化 關於負載均衡的一切 異構伺服器負載均衡及過載保護 lvs為何不能完全替代dns輪詢 究竟啥才是網際網路架構 高併發 究竟啥才是網際網路架構 高可用 100億資料1萬屬性...

架構師之路

架構的定義 我們來看看軟體架構的一般定義 程式和計算系統軟體體系結構是指系統的乙個或多個結構。該結構包括軟體的構建,構建的外部可見屬性以及它們之間的相互關係。該體系結構不是可操作的軟體。具體來說,這是乙個表示式,它使軟體工程師能夠 分析滿足監管要求的設計有效性。在設計更改相對容易的階段,請考慮架構的...