啟示錄: HandlerFrame是一個基于觀察者模式采用信息分發機制實現跨界面Handler通訊框架,整個項目里面只存在一個Handler實例對象。
在實際開發中你是不是也曾經因為handler通訊造成內存吃緊過呢?又或者因為無法跟其它頁面通訊而苦苦摸索過呢?
恭喜你答對了,這些我都遇到過。
何時使用跨界面通訊:當前頁面有些操作成功之后會影響其它頁面數據變化,就要使用跨界面通訊。
相信做過電商的朋友們應該都知道購物車概念吧!(購物車-->購買-->清空購物車)購物車的概念差不多都是這個樣子的。
購買成功是不是就要發消息告訴購物車頁面刷新數據,此時就要跨界面通訊了。
前言:HandlerFrame的由來
我封裝的HandlerFrame框架其實是因為有人給我靈感才完成的。
這個人就是Nohttp的作者嚴振杰-嚴振杰的博客-點擊進入
因為那段時間我確實遇到因為Handler造成的內存吃緊問題,正好他封裝了一個超簡單的Handle,優化內存的Handler工具。然后我就拿來用參考一下。在參考的過程中我發現他寫的這個調用起來太繁瑣了,而且耦合性太高了,所以我就在他的那個工具靈感下重新封裝一個‘使用觀察者模式對信息發送采取信息分發機制去封裝。讓操作界面之間通訊完全解耦,調用起來沒有那么繁瑣。優化Handler內存,且跨界面通訊。’的Handler框架。
透露一個小秘密0_0....我在封裝好這個Handler框架時,我特么都不知道什么是觀察者模式和信息分發機制(一直都是一個人開發,沒有人指點,所以......你懂的。)。你是不是想問,既然你都不知道什么是觀察者模式,那特么你還說你這個是基于觀察者模式封裝的?哈哈....這個其實也要感謝嚴振杰-嚴振杰的博客-點擊進入了。因為我把封裝好的框架發給他看時,是他告訴我這個封裝是用觀察者模式去的。我記得我當時還特意去搜了一下,才知道這確實觀察者模式封裝。
我發現只要你的技術達到一個高度之后,你寫的代碼不知不覺就進入你都不曾了解的世界里面去了。
主題內容
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? HandlerFrame架構圖(畫的不好,請多多見諒)
一:BaseHandler核心類(代碼截圖請以實際代碼為主)
BaseHandler繼承Handler采取單例模式。
然后在BaseHandler對象里面用稀疏數組SparseArray存儲OnBaseHandlerUpDateListener接口實現對象,然后通過實現Handler中的handleMessage()去發送信息給OnBaseHandlerUpDateListener接口實現對象。
SparseArray存儲的key通過OnBaseHandlerGetKeyListener接口去獲取訂閱對象的唯一ID。SparseArray存儲的value用SoftReference軟引用做載體存儲。
如果注銷訂閱,通過OnFactoryOperateListener接口去清除訂閱對象生成存儲的ID。
BaseHandler類實現OnBaseHandlerMethodListener接口對SparseArray對象的增刪查調等方面的操作。
二:BaseHandlerOperate核心類(代碼截圖請以實際代碼為主)
BaseHandlerOperate主要是通過操作OnBaseHandlerMethodListener接口對BaseHandler進行控制。
BaseHandlerOperate實現OnBaseHandlerGetKeyListener接口,在重寫handlerGetKey()方法中通過BaseHandlerFactoryId對象去生成訂閱對象唯一的ID值。
BaseHandlerOperate實現OnFactoryOperateListener接口對BaseHandlerFactoryId對象中的訂閱對象ID做注銷操作。
BaseHandlerOperate實現OnBaseHandlerOperateListener接口是為了讓其他接口實現方法屏蔽對外操作。提現接口隔離原則。
BaseHandlerOperate類是為了更好讓BaseHandler和Activity解耦。
BaseHandlerFactoryId對象是專門生產訂閱對象唯一ID對象。通過算法保證訂閱對象生成的ID值唯一性。具體怎么實現的請參考代碼。
三:OnBaseHandlerMethodListener接口(代碼截圖請以實際代碼為主)
四:OnBaseHandlerUpDateListener接口(代碼截圖請實際代碼為主)
簡單使用說明(代碼截圖請以Demo實際代碼為主)
用一個Acitivty基類去實現OnBaseHandlerUpDateListener接口,然后獲取BaseHandlerOperate實例。
然后繼承BaseActivity的子類就可以調用BaseHandlerOperate里面的方法去進行你想要的操作就可以了,
如果你能使用期間發現問題,代表你有一雙發現問題眼睛。如果你能把問題反饋給我,說明你有一份樂于助人的心靈。