經常使用事件消息傳遞多線程
① 一個實現了監聽器接口的類,必須把它自身註冊到它想要監聽的類中去post
② 使用廣播,內部的實現都須要IPC,從傳遞效率上來講,可能並不太適合上層的組件間的通訊優化
③ Activity間的消息傳遞時經過startActivityForResult 和onActivityResult,會產生較多的狀態或邏輯判斷,並且Intent或Bundle傳值還得檢測類型,容易發生錯誤this
什麼是EventBus?spa
EventBus是一款針對Android優化的發佈/訂閱事件總線,主要功能是替代Intent,Handler,Broadcast在Fragment,Activity,Service,線程之間傳遞消息,優勢是開銷小,代碼更優雅,以及將發送者和接收者解耦,他能夠讓倆個組件相互通訊,可是它們之間並不相互知曉線程
事件總線發佈EventBus與otto的區別?接口
什麼是事件總線管理:隊列
將事件放在隊列裏面,用於管理和分發事件
保證應用的各個部分之間高效的通訊及數據,事件分發get
模塊間解耦
Eventbus包含四個部分:
發佈者(publisher),訂閱者(subscriber),事件,總線
使用時須要先訂閱註冊,而後向訂閱者發佈消息便可
訂閱者能夠訂閱多個事件,發佈者能夠發佈任何事件,發佈者同時也能夠是訂閱者
步驟:訂閱,註冊,發佈,取消註冊
基本用法:
註冊:
① EventBus.getDefault().register(this);
② EventBus.getDefault().register(new Event());
③ EventBus.getDefault().register(this,methodName,Event.class);
三個參數:消息訂閱者(接收者),接收方法名,事件類
取消註冊:
① EventBus.getDefault().unregister(this);
② EventBus.getDefault().unregister(new Event());
訂閱處理數據:
① onEventMainThread 運行在主線程中,能夠在這直接操做UI
② onEvent 與發佈者在同一個線程
③ onEventPostThead 發佈者發送數據的線程與接收者接收的線程是一個
④ onEventAsync 執行在一個新的線程,適用多個多線程處理,內部有線程池管理,在獨立線程中運行
⑤ onEventBackgroundThread 執行在子線程,若是發佈者在子線程則直接執行,若是不是在子線程那麼建立一個新的線程,在後臺線程中運行
發佈:EventBus.getDefault().post(new Event(meg));