线程没有固定执行顺序,Subscribe需要通过priority值,优先接收到消
在Subscribe订阅的类中操作如下:
// 注册eventBus
EventBus.getDefault().register(this);
// 注销eventbus
EventBus.getDefault().unregister(this);
@Subscribe(threadMode = ThreadMode.Main,priority = 数值越大,优先级高,sticky=true/false)
public void 可自定义方法名称() { }
在被订阅者中执行:
EventBus.getDefault().post(Object);
// 黏粘性事件(注册EventBus后,会立即收到之前PostSticky()的事件)
EventBus.getDefault().postSticky(Object);
Main : 表示事件处理函数的线程在主线程(UI)线程,不能有耗时操作(能接收到子线程中发送的消息)
MAIN_ORDERED : 按顺序执行,测试发现是:执行在Main之后
ASYNC:表示无论事件发布的线程是哪一个,事件处始终会新建一个子线程运行,不能进行UI操作
BACKGROUND:表示处理函数的线程是后台线程,如果发布线程是UI线程,事件处理会创建一个子线程进程处理,如发布线程是子线程,事件在该线程处理
POSTION:(DEFAULD)表示处理函数的线程跟发布事件的线程在同一个线程。
取消事件往下传递:
EventBus.getDefault().cancelEventDelivery(str);
PS: 在取消事件传递的时候有一个注意点,在取消事件传递的方法的线程Mode必须是POSTING的,不然会报event handlers may only abort the incoming event的异常,可以从cancelEventDelivery的源码中看到,在下面代码中的最后一个判断,如果当前事件接收方法不是POSTING,就会抛出这个异常:
2019-06-03 17:19:43.713 22988-22988/com.baidu.test.testandroid E/EventBus: Could not dispatch event: class java.lang.Integer to subscribing class class com.baidu.test.android.eventbus.ShowEventFragment
org.greenrobot.eventbus.EventBusException: event handlers may only abort the incoming event
at org.greenrobot.eventbus.EventBus.cancelEventDelivery(EventBus.java:291)