Android EventBus框架學習筆記

主要經過某大拿的文章進行學習,作一下本身理解的記錄:html

http://www.cnblogs.com/angeldevil/p/3715934.html框架

 

總的來講eventbus是這麼一個實現思路:異步

1.訂閱者註冊event:把訂閱者以「onEvent」開頭的方法,經過參數類型、運行方式區分,保存到map裏。post

2.發佈者:經過參數類型取出全部運行方式、全部訂閱者的對應方法,把參數傳入並執行。學習

*運行方式主要有三種:主線程、後臺、異步任務ui

 

主要邏輯:spa

一.findSubscriberMethods:找到類裏的全部方法(包括繼承自基類的),比較方法名,取出符合命名規則要求的,以list形式插入到methodCache裏,線程

key爲類名+".onEvent"(若是默認)。設計

二.subscribe:1. eventType爲實例化SubscriberMethod時傳入,爲方法的第一個參數類型;
           2.SubscriberMethod對象包含三個關鍵信息,method、threadMode、eventType
                    3.subscriptionsByEventType裏存放eventType與Subscription的映射,Subscription關鍵參數爲訂閱者和SubscriberMethod
                    4.typesBySubscriber裏放的是訂閱者和eventType的list的映射,意義是一個訂閱者能夠有多個事件(多個方法參數)
                    5.註冊的過程就是把訂閱者和方法組成一個實體,放到一個map裏,以便發送時只經過發送的參數類型,就能找到全部訂閱者及其應該執行哪個方法(
                       由於方法的線程模式不一樣因此同種參數類型同個訂閱者可能存在多個方法)htm

三:postToSubscription:經過不同的運行方法發送消息。管理一系列的HandlerPoster對象來實現發送隊列的管理。

 

其餘在轉載來的原文裏有詳細說明就再也不復制。

 

總結:

1.因爲eventbus框架是別人帶進來的,因此按照他的用發主要用來頁面間傳遞一些參數,看過源碼後發現應該主要是用來實現事件的發送和接受,參數只是附加的。二者的區別在:若是隻是傳一些值,就會碰到不少參數類型衝突。好比帶進這個框架的小子的用發,傳一個用戶信息的實體,在訂閱者那邊接受這個實體來進行ui的更新,那若是其餘地方須要傳遞用戶信息來進行用戶的添加呢?因爲eventbus的發送至認參數類型(也就是事件),因此顯然最初不是被設計爲來解決傳遞值的問題的。這個例子裏的作法應該是定義兩個事件:更新用戶信息、添加用戶信息。

2.在訂閱者類裏除了註冊eventbus,主要經過方法名來接受消息,好比onEventMainThread就是接受在主線程發出的消息。eventbus是經過反射來實現這些訂死了的方法名的比較。這就致使開發上的不方便,像我這種記性極差的人,常常須要到其餘地方把方法名copy過來。

此次研究的主要目的也是爲了實現經過重寫基類方法、或者調用統一入口來往eventbus的執行隊列裏面插對象,接口就不考慮了,增長了耦合性。結果發現沒那麼好整。

首先若是經過重寫基類,那就是要在基類裏寫上3個方法等待子類重寫,這個時候若是在訂閱者類裏register了eventbus,會把子類、父類的方法所有插入隊列,也就是假如我只須要實現主線程接受,其餘兩個方法依然會插入隊列,會對他們發送消息。雖然對效果沒影響,可是顯然不是最好的實現方法。

而後就是統一路口這個方式了,個人思路是往eventbus裏面傳一些參數爲interface的對象,而後模仿他維護幾個隊列進行這些接口的執行。後來研究了一下發現這樣估計時間成本還比較大。

 

沒有完美的方案,那仍是等有時間的時候再來仔細把源碼吃透後再改。

此次的學習中也涉及到了aop的一些概念和實現思路,也算是受益不淺。

相關文章
相關標籤/搜索