EventBus事件發(fā)布-訂閱總線,是用來進(jìn)行Activity、Fragment之間(任何組件間都可以)的通信,可在任意處進(jìn)行訂閱,訂閱后即可接收到對應(yīng)的事件并進(jìn)行操作
1.使用方法
//一般使用默認(rèn)配置,在onCreate中進(jìn)行注冊,最好在onCreate的最后進(jìn)行(在所需組件完成初始化后即可,簡單起見放在最后,否則可能在接收到事件后使用到的組件還未初始化引起空指針錯誤)
EventBus.getDefault().register(this)
//在onDestroy中進(jìn)行注銷
EventBus.getDefault().unregister(this)
//在發(fā)送和接收事件之前需要創(chuàng)建事件類,可根據(jù)需求隨意創(chuàng)建(也可使用枚舉類型),例如:
public class ExampleEvent{
public int example;
}
//或
public enum ExampleEventEnum{
EXAMPLE_ONE,
EXAMPLE_TWO
}
//使用‘@Subscribe(boolean sticky,ThreadMode,int priority)’注解標(biāo)記訂閱方法用來接收eventBus事件,例如:
@Subscribe(sticky = false,ThreadMode = ThreadMode.MAIN,priority = 0)
public void onEvent(ExampleEvent event){
XXXXXX;
}
//sticky為粘性標(biāo)記,是否可以接收到粘性事件,粘性的意思就是可以先發(fā)送事件再注冊EventBus也能收到事件
//ThreadMode為線程標(biāo)記,存在POSTING,MAIN,BACKGOUND,ASYNC四種類型。POSTING發(fā)送與接收在同一個線程;MAIN在主線程調(diào)用;BACKGROUND在非主線程接收,如果發(fā)送在非主線程則不會進(jìn)行線程切換;ASYNC為始終都會開啟一個新線程
EventBus.getDefault().post(new ExampleEvent())//發(fā)送普通事件
EventBus.getDefault().postSticky(new ExampleEvent())//發(fā)送粘性事件
2.基本原理
1、使用單例模式保持EventBus全局唯一并始終存活
2、保存注冊的Activity(Object類型,一般用在Activity或Fragment等具有生命周期的組件中,方便綁定和解綁),使用反射去查找?guī)в蠤Subscribe注解的方法,保存該方法(Method對象以及注解參數(shù))
3、在使用時發(fā)送post,將該對象存入一個Queue,然后不斷的從該Queue中取出event,查找到對應(yīng)的Acitivity(Object類型)和方法,使用反射進(jìn)行調(diào)用