一、EventBus的使用
1.自定义消息类型,也就是你要传输的消息体
public class MessageEvent{
private String message;
public MessageEvent(String message){
this.message=message;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
2.在Activity或者Fragment里面注册事件
EventBus.getDefault().register(this);
3.在你需要的地方发送事件
EventBus.getDefault().post(messageEvent);
4.Activity或者Fragment处理事件,方法名称可以自定义,但是必须有@Subscribe注解,注解参数可以有3个,threadMode(在哪个线程回调这个方法) 、sticky(是否为粘性事件)、priority(事件接收的优先级)
@Subscribe(threadMode = ThreadMode.MAIN)
public void onMessage(MessageEvent messageEvent) {
...
}
5.在Activity或者Fragment里面注销事件
if(EventBus.getDefault().isRegistered(this)) {
EventBus.getDefault().unregister(this);
}
二、EventBus原理浅析
1.注册
(1).注册流程是通过反射,找到Activity或者Fragment中所有的注册方法,然后包装成SubscriberMethod存到List中
(2).根据该订阅者的所有订阅的事件类型,将订阅者存入到每个以 事件类型为key 以所有订阅者为values的map集合中
(3).然后将订阅事件添加到以订阅者为key 以订阅者所有订阅事件为values的map集合中
2.发送消息
(1)发送消息的过程就是去上述的Map中取出所有订阅事件,然后逐一发送。如果是sticky事件,先判断下是否有注册,如果没有注册,则存起来,待下次该sticky事件注册的时候,会来这里查,如果有未发出去的sticky,则会直接发送。
EventBus发送消息并没有定向发送,而是想所有订阅者发送,所以需要通过自定义消息体来区分当前消息需不需要处理。
3.注销
(1)就是清空当前订阅者相关的map