EventBus :針對Android優(yōu)化的發(fā)布/訂閱事件總線,簡化應用程序內各組件間、組件與后臺線程間的通信。
優(yōu)點:開銷小,代碼又簡潔優(yōu)雅,將發(fā)送者和接受者解耦。
eventbus三要素
1.event:事件,可以是任意類型的對象
2.Subscriber:事件訂閱者,eventbus3.0之前消息處理的方法只限定于onEvent()/onEventMainThread()/onEventBackgroundThread()和onEventAsync()四種線程模型。3.0之后事件處理的方法可以隨便取名,但是需要添加注解@Subsceribe,和指定線程模型(默認posting)
3.publisher:事件發(fā)布者,可以在任意線程任意位置發(fā)送事件,直接調用eventbus的post(object)方法??勺约簩嵗痚ventbus對象,一般使用eventbus。getDefault()就可,根據(jù)post函數(shù)參數(shù)的類型,會自動調用訂閱相應類型事件的函數(shù)
eventbus的四種線程模型
1.posting(默認):若使用事件處理函數(shù)指定了線程模型,那么該事件在哪個線程發(fā)布出來的,時間梳理函數(shù)就會在那個線程中運行。也就是說發(fā)布事件和接收事件在同一個線程,在該線程的事件處理函數(shù)中盡量避免執(zhí)行耗時操作,因為它會阻塞時間的傳遞,甚至可能引起ANR
2.MAIN:事件的處理會在UI線程中執(zhí)行,事件處理的時間不能太長,否則會ANR
3.BACKGROUND:事件的處理會在UI線程中發(fā)布出來,那么該事件處理函數(shù)就會在新的線程中運行,如果事件本來就是子線程發(fā)布出來的,那么該事件處理函數(shù)直接在發(fā)布事件的線程中執(zhí)行。此事件處理函數(shù)中禁止進行UI更新操作
4.async:無論事件在哪個線程發(fā)布,該事件處理函數(shù)都會在新建的子線程中執(zhí)行,同樣的,此事件處理函數(shù)禁止進行UI更新操作
使用流程
1.自定義一個事件類
public class UserData {
private String name;
private String message;
//getter setter
}
2.在需要訂閱事件的地方注冊事件
EventBus.getDefault().register(this);
3.發(fā)送事件
UserData data = new UserData();
data.setName("老子王");
data.setMessage("今天中了一等獎");
EventBus.getDefault().post(data);
4.處理事件
/**
*sticky 如果為true,則發(fā)送最近的粘性事件
*priority 訂閱者優(yōu)先級,影響事件傳遞的順序,越大優(yōu)先級越高
**/
@Subscribe(threadMode = ThreadMode.MAIN, sticky = true, priority = 1)
public void eventBus(UserBean userBean){
//todo 發(fā)送事件傳遞來的消息,想干啥干啥
}
5.取消事件訂閱
EventBus.getDefault().unregister(this);
粘性事件
使用postSticky()發(fā)送事件,那么可以不需要先注冊,也能接受到事件,也就是一個延遲注冊的過程。