EventBus原始碼解析(二)

2021-07-27 08:17:24 字數 2357 閱讀 4083

那麼我們就馬上進入主題吧,上篇文章分析到boolean sticky這個引數和registersticky(object subscriber)這個方法,這個方法與之前我們註冊的方法是不是很像啊?

public

void

register(object subscriber)

public

void

registersticky(object subscriber)

if(sticky) 

if(stickyevent != null)

}

顯然只有當sticky被賦值為true的時候才會進入這個if判斷語句,stickyevents是乙個map集合,如果stickyevents是空的,那麼這段**看上去好像沒有什麼意義,那麼我們來看看stickyevents這個map集合是什麼時候往裡面新增資料的。

public

void

poststicky(object event)

this.post(event);

}

原來是在poststicky(object event)這個方法裡新增的,原來registersticky(object subscriber)和poststicky(object event)是一對啊!

等一下,為什麼感覺有點奇怪呢,感覺是先發布,後註冊!poststicky()這個方法好像在registersticky()這個方法之前呼叫,因為只有你得先將資料新增到stickyevents集合當中,然後才能從stickyevents集合中獲取到資料。

來分析一下吧,如果先發布poststicky(object event),會將傳入物件的class作為key,傳入的物件作為值存入stickyevents集合中,然後呼叫post(event),之前我們分析過了,post(event)主要是找到subscriptionsbyeventtype這個集合去取值,然後通過反射去呼叫相應的方法,但是這裡我們都還沒有註冊,所以subscriptionsbyeventtype這個集合肯定是沒有資料的,因此按理說是不會呼叫方法的,but但是還記得當我們註冊的時候使用的是registersticky()這個方法時不是有這段**嗎stickyevent = this.stickyevents.get(eventtype);這個時候stickyevents集合裡面是有資料的啊,那麼stickyevent 就不為null了,在往下看:

if(stickyevent != null)
進入到這個if()判斷語句當中,會呼叫posttosubscription這個方法,

private

void

posttosubscription(subscription subscription, object event, boolean ismainthread) else

break;

case

3: if(ismainthread) else

break;

case

4: this.asyncposter.enqueue(subscription, event);

break;

default:

throw

new illegalstateexception("unknown thread mode: " + subscription.subscribermethod.threadmode);

}}

我想問這個方法你熟不熟?很熟了吧,不就是找到了對應的subscription物件通過反射呼叫對應的方法嗎?現在你知道這個boolean sticky是幹什麼用的了吧,它可以讓我們倒著使用eventbus,這麼說好像不太通俗,就是你可以先發布事件,我稍後註冊依然可以找到你並呼叫對應的方法來實現通訊的功能,但是跟先註冊後發布還是有區別的,這次我並不是從subscriptionsbyeventtype拿到的資料,而是從stickyevents這個集合中拿到的資料哦!

這篇文章就分析到這裡了,通過這兩篇文章來總結一下eventbus:

它既可以先註冊,然後再發布物件,也可以先發布物件,後註冊呼叫相應的方法。

還有就是在專案中使用eventbus時我曾經踩過乙個坑,當時執行緒我們封裝起來了,結果post(object event)是在子執行緒中呼叫的,而我卻在oneventmainthread()中寫**…….. 這裡一定要注意,在那個執行緒發布事件,就要在對應的方法中寫**,好了,通過這兩篇文章,eventbus原始碼的已經分析完了,希望這兩篇文章能幫到大家的同時讓自己的思路也更加清晰。

EventBus原始碼解析二

上次分析了 註冊 這次分析下 事件傳送 eventbus.getdefault post new anyeventtype setresult aaa public void post object event try finally eventqueue.add event 新增到事件佇列中,然後...

EventBus3 0原始碼解析

eventbus的註冊 eventbus.getdefault register this 那麼我們來看一下eventbus.getdefault 到底做了一下什麼操作 public static eventbus getdefault return defaultinstance 就是拿到了eve...

EventBus原始碼解析01 獲取例項

通常,我們會通過getdefault 來獲取eventbus的例項。eventbus.getdefault 我們來檢視他內部的實現。public static eventbus getdefault return defaultinstance 可以看到,這是個雙重校驗鎖的單例模式,說明通過getd...