EventBus的使用想必大家也都有所了解了吧, 毕竟出来这么多年了。 这里我也再给大家做个简单的介绍吧。
首先,先在接收类中 注册:
EventBus.getDefault().register(this);
然后编写Event实体类:
public class EventStudent { private int id; public int getId() { return id; } public void setId(int id) { this.id = id; } public EventStudent(int id){ this.id = id; } }
并在接收类中编写参数给该实体类的方法(EventBus 是根据参数一致性来识别的):
@Subscribe(threadMode = ThreadMode.POSITION) public void receiverEventBus(EventStudent eventStudent){ LoggerDebug.d("----------------receiverEventBus" + eventStudent.getId()); if(null == eventStudent){ return ; } switch(eventStudent.getId()){ case 0: break; default: break; } }
接着在发送类中写发送方法:
public class TestEventBus { public TestEventBus(){ } public void sendStudentEvent(){ new Thread(){ @Override public void run() { super.run(); } }.start(); EventBus.getDefault().post(new EventStudent(1)); } }
然后在你需要发送的地方,创建实例,调用方法即可发送。
最后记得在退出时要在注册类中进行反注册:
EventBus.getDefault().unregister(this);
否则下一次会收到重复的消息。
想必只要使用过EventBus的就会发现 我在接收方法中的tag上 有写着这么一句代码
@Subscribe(threadMode = ThreadMode.POSITION)
大家可以通过按ctrl+点击@Subscribe,进入源码。 会发现其实@Subscribe 注解中有3个可用的抽象方法:
ThreadMode threadMode() default ThreadMode.POSTING;
boolean sticky() default false;
int priority() default 0;
第一个 threadMode表示的是 设置该接收方法运行的线程。
ThreadMode.POSITION 表示接收方法 和发送方 处于同一个线程;
ThreadMode.MAIN 表示 接收方法运行在Main线程中, 与发送方的线程没有关系;
ThreadMode.BACKGROUND 表示 接收方法运行在后台线程, 与发送方的线程没有关系(就一个后台线程);
ThreadMode.ASYNC 表示 接收方法强制运行在后台线程, 与发送方的线程没有关系(每个事件都会启动一个线程);
第二个sticky,表示发送的是否是黏性事件。 默认为false,表示不是, true表示是。
黏性事件的解释为:
Sticky Event是指我注册一个sticky的订阅,这样注册之前发送的sticky事件的最近的一个会保存在内存中,错过这个事件的发送的情况下,也可以通过getStickyEvent收到。
postSticky(event) :发送sticky的event 。 注册方法还是 register(subscriber) :注册接收sticky事件的订阅者。 获取: getStickyEvent(Class);移除:removeStickyEvent(Obgect)
第三个priority 表示的是执行的优先级 , 值为int类型
当一个类中有多个相同参数的接收方法时, 如果这几个接收方法都跑在同一个线程中的话, 那么priority值越大,优先级就越高,就越先执行。否则按照代码的先后顺序执行。
当一个是MAIN线程, 一个是非MAIN线程 时,在priority相同时,MAIN在前就先MAIN线程接收,否则随机, 当MAIN的priority高时, 则一定是MAIN的先执行, 反之还是随机。