最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android?EventBus粘性事件實現(xiàn)機制探究

 更新時間:2022年05月31日 09:27:55   作者:長安皈故里  
最近項目做組件化,需要進行組件化的通信,有時候可能會出現(xiàn)異步的情況,事件接收方還沒準備好事件就已經(jīng)發(fā)送過來了,這時候想到了EventBus的粘性事件,這篇文章主要給大家介紹了關(guān)于Android?EventBus粘性事件實現(xiàn)機制的相關(guān)資料,需要的朋友可以參考下

眾所周知,EventBus是支持粘性事件的,即可以先發(fā)送粘性事件,然后再注冊,代碼如下:

  • 粘性事件觀察者
@Subscribe(threadMode = ThreadMode.MAIN, sticky = true)
fun registerEventBus(o: Any) {    
}
  • 發(fā)送粘性事件
EventBus.getDefault().postSticky(Any())
  • 注冊EventBus
EventBus.getDefault().register(this)

接下來我們就來探究下EventBus的粘性事件是如何實現(xiàn)的。

postSticky()內(nèi)部機制

  • 如果是發(fā)送的粘性事件,會添加到stickyEvents中,看下這個屬性的實現(xiàn):

可以看到這個屬性是一個Map集合,其中key為事件類型的class對象,value為對應(yīng)的事件類型。

  • 繼續(xù)看下post(Event)方法:

  • 首先將這個粘性事件添加到PostingThreadState(線程私有)的eventQueue集合中

  • 通過isMainThread方法判斷當前是否為主線程,最終會調(diào)用到我們熟悉的Looper.getMainLooper() == Looper.myLooper()進行判斷

  • 循環(huán)遍歷eventQueue隊列,不斷的取出集合元素進行分發(fā),看下postSinleEvent()方法如何實現(xiàn):

  • 如果eventInheritance為true,會查找當前發(fā)送的粘性事件類型的父類型,并返回查找到的集合

  • 接下來就會調(diào)用postSingleEventForEventType()方法來進行最終粘性事件的分發(fā),即通知通過@Subscribe注解注冊的粘性事件觀察者,看下具體實現(xiàn):

  • 調(diào)用subscriptionsByEventType獲取注冊該事件類型的所有訂閱方法,但是由于這個時候我們是先發(fā)送的粘性事件再注冊EventBus,而subscriptionsByEventType中集合元素的填充實在注冊EventBus發(fā)生的,所以通過subscriptionsByEventType獲取到的subscriptions將是null的,所以接下來肯定不會走下面的if代碼塊中的邏輯了。

postSticky()小結(jié)

上面這么多代碼邏輯,其實只干了一件事,就是將這個粘性事件添加到了stickyEvents這個集合中。之后的邏輯雖多,但和粘性事件沒啥關(guān)系。

register內(nèi)部機制

  • findSubscriberMethods()這個方法里面的邏輯就不帶大家進行分析了,總之就干了一件事情:

查找當前類通過@Subscribe注冊的所有事件訂閱方法,并返回一個List<SubscriberMethod>集合,其中SubscriberMethod就是對每個注冊的訂閱方法和當前注冊類的封裝

  • subscribe這個方法是關(guān)鍵,深入探究下:

  • 第1、2、3、4步中其實就干了兩件事情:

    • 填充subscriptionsByEventType集合,key為事件類型,value為通過@Subscribe訂閱了該事件類型的方法集合
    • 填充typesBySubscriber集合,key為注冊EventBus的類,value為該類中所有@Subscribe注解修飾的方法集合
  • 第5步就是實現(xiàn)粘性事件分發(fā)的關(guān)鍵地方

    • 首先判斷當前@Subscribe修飾的訂閱方法是否為粘性,即@Subscribe(sticky = true)sticky等于true
    • 是的話就從stickyEvents集合中判斷是否存在和訂閱方法中注冊的事件類型相同的事件:

    這個stickyEvents是不是很熟悉,就是我們之前發(fā)送粘性事件時,將粘性事件添加到的方法集合

    • 如果存在,則就執(zhí)行該粘性事件的分發(fā),即調(diào)用執(zhí)行該訂閱方法,最終會調(diào)用到invokeSubscriber()方法:

從上面可以看到,最終是通過反射來實現(xiàn)的訂閱了粘性事件方法的執(zhí)行。

register小結(jié)

該方法最終會判斷當前是否存在注冊EventBus前發(fā)送的粘性事件,且當前注冊類中存在訂閱該事件類型的方法,然后立即執(zhí)行。

總結(jié)

以上就是EventBus粘性事件的內(nèi)部實現(xiàn)機制,總體來說不算復(fù)雜,大家看著文章跟著源碼一步步分析應(yīng)該就很容易理解這部分實現(xiàn)邏輯了。

到此這篇關(guān)于Android EventBus粘性事件實現(xiàn)機制的文章就介紹到這了,更多相關(guān)Android EventBus粘性事件內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Android實現(xiàn)頁面跳轉(zhuǎn)的全過程記錄

    Android實現(xiàn)頁面跳轉(zhuǎn)的全過程記錄

    對于android軟件開發(fā)初級學(xué)習(xí)者來說,簡單的頁面跳轉(zhuǎn)是必學(xué)的,這篇文章主要給大家介紹了關(guān)于Android實現(xiàn)頁面跳轉(zhuǎn)的相關(guān)資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下
    2021-10-10
  • 詳解Flutter WebView與JS互相調(diào)用簡易指南

    詳解Flutter WebView與JS互相調(diào)用簡易指南

    這篇文章主要介紹了詳解Flutter WebView與JS互相調(diào)用簡易指南,分為JS調(diào)用Flutter和Flutter調(diào)用JS,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-04-04
  • Android 8.0實現(xiàn)發(fā)送通知

    Android 8.0實現(xiàn)發(fā)送通知

    這篇文章主要為大家詳細介紹了Android 8.0實現(xiàn)發(fā)送通知,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-07-07
  • FFmpeg?Principle學(xué)習(xí)new_video_stream添加視頻輸出流

    FFmpeg?Principle學(xué)習(xí)new_video_stream添加視頻輸出流

    這篇文章主要為大家介紹了FFmpeg?Principle學(xué)習(xí)new_video_stream添加視頻輸出流示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-10-10
  • Android修改自己程序字體的方法詳解

    Android修改自己程序字體的方法詳解

    本篇文章是對Android修改自己程序字體的方法進行了詳細的分析介紹,需要的朋友參考下
    2013-06-06
  • Kotlin入門教程之開發(fā)環(huán)境搭建

    Kotlin入門教程之開發(fā)環(huán)境搭建

    最近kotlin大熱,Kotlin作為 Android 領(lǐng)域的 Swift,絕對讓你如沐春風(fēng),下面這篇文章主要給大家介紹了關(guān)于Kotlin入門教程之開發(fā)環(huán)境搭建的相關(guān)資料,文中將實現(xiàn)的方法一步步介紹的非常詳細,需要的朋友可以參考下。
    2017-10-10
  • Android自定義流式布局/自動換行布局實例

    Android自定義流式布局/自動換行布局實例

    這篇文章主要介紹了Android自定義流式布局/自動換行布局實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-03-03
  • android自定義窗口標題示例分享

    android自定義窗口標題示例分享

    這篇文章主要介紹了android自定義窗口標題示例,需要的朋友可以參考下
    2014-03-03
  • Android實現(xiàn)聊天界面

    Android實現(xiàn)聊天界面

    這篇文章主要為大家詳細介紹了Android實現(xiàn)聊天界面的方法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-06-06
  • Android開發(fā)獲取手機Mac地址適配所有Android版本

    Android開發(fā)獲取手機Mac地址適配所有Android版本

    這篇文章主要介紹了Android開發(fā)獲取手機Mac地址適配所有Android版本,需要的朋友可以參考下
    2020-03-03

最新評論

肇庆市| 鲁山县| 三台县| 邻水| 莱阳市| 财经| 陕西省| 安吉县| 武威市| 彰化市| 福清市| 册亨县| 响水县| 文水县| 石门县| 神农架林区| 荔波县| 廉江市| 孟州市| 遂宁市| 佳木斯市| 彝良县| 共和县| 隆德县| 彭阳县| 泰来县| 罗田县| 霸州市| 当涂县| 前郭尔| 红安县| 湘潭市| 甘肃省| 平顶山市| 永靖县| 永德县| 澎湖县| 儋州市| 宁德市| 克什克腾旗| 高碑店市|