EventBus事件發(fā)布-訂閱總線旺入,是用來進(jìn)行Activity、Fragment之間(任何組件間都可以)的通信坐梯,可在任意處進(jìn)行訂閱郎汪,訂閱后即可接收到對應(yīng)的事件并進(jìn)行操作
1.使用方法
//一般使用默認(rèn)配置,在onCreate中進(jìn)行注冊,最好在onCreate的最后進(jìn)行(在所需組件完成初始化后即可劝萤,簡單起見放在最后渊涝,否則可能在接收到事件后使用到的組件還未初始化引起空指針錯(cuò)誤)
EventBus.getDefault().register(this)
//在onDestroy中進(jìn)行注銷
EventBus.getDefault().unregister(this)
//在發(fā)送和接收事件之前需要?jiǎng)?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ā)送與接收在同一個(gè)線程洒敏;MAIN在主線程調(diào)用龄恋;BACKGROUND在非主線程接收,如果發(fā)送在非主線程則不會(huì)進(jìn)行線程切換凶伙;ASYNC為始終都會(huì)開啟一個(gè)新線程
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乘碑、在使用時(shí)發(fā)送post挖息,將該對象存入一個(gè)Queue,然后不斷的從該Queue中取出event兽肤,查找到對應(yīng)的Acitivity(Object類型)和方法套腹,使用反射進(jìn)行調(diào)用