EventBus事件发布-订阅总线,是用来进行Activity、Fragment之间(任何组件间都可以)的通信,可在任意处进行订阅,订阅后即可接收到对应的事件并进行操作
1.使用方法
//一般使用默认配置,在onCreate中进行注册,最好在onCreate的最后进行(在所需组件完成初始化后即可,简单起见放在最后,否则可能在接收到事件后使用到的组件还未初始化引起空指针错误)
EventBus.getDefault().register(this)
//在onDestroy中进行注销
EventBus.getDefault().unregister(this)
//在发送和接收事件之前需要创建事件类,可根据需求随意创建(也可使用枚举类型),例如:
public class ExampleEvent{
public int example;
}
//或
public enum ExampleEventEnum{
EXAMPLE_ONE,
EXAMPLE_TWO
}
//使用‘@Subscribe(boolean sticky,ThreadMode,int priority)’注解标记订阅方法用来接收eventBus事件,例如:
@Subscribe(sticky = false,ThreadMode = ThreadMode.MAIN,priority = 0)
public void onEvent(ExampleEvent event){
XXXXXX;
}
//sticky为粘性标记,是否可以接收到粘性事件,粘性的意思就是可以先发送事件再注册EventBus也能收到事件
//ThreadMode为线程标记,存在POSTING,MAIN,BACKGOUND,ASYNC四种类型。POSTING发送与接收在同一个线程;MAIN在主线程调用;BACKGROUND在非主线程接收,如果发送在非主线程则不会进行线程切换;ASYNC为始终都会开启一个新线程
EventBus.getDefault().post(new ExampleEvent())//发送普通事件
EventBus.getDefault().postSticky(new ExampleEvent())//发送粘性事件
2.基本原理
1、使用单例模式保持EventBus全局唯一并始终存活
2、保存注册的Activity(Object类型,一般用在Activity或Fragment等具有生命周期的组件中,方便绑定和解绑),使用反射去查找带有@Subscribe注解的方法,保存该方法(Method对象以及注解参数)
3、在使用时发送post,将该对象存入一个Queue,然后不断的从该Queue中取出event,查找到对应的Acitivity(Object类型)和方法,使用反射进行调用