(@Deprecated 这篇文章是讲EventBus2.4.0及之前版本的,最新的版本使用戳这里。)
注册(订阅)
所有的注册都是调用EventBus这个类下的私有方法
private void subscribe(Object subscriber, SubscriberMethod subscriberMethod, boolean sticky, int priority)
- subscriber 这个参数是订阅的对象
-
subscriberMethod 这个参数是订阅的方法,最新的版本把这个参数默认了,不开放出来了,我们能写的方法有四个(具体用法后面讲,T代表任意引用类型):
1、onEvent (T event)
2、onEventMainThread (T event)
3、onEventBackgroundThread (T event)
4、onEventAsync (T event)
如果不是这四个会报错! - sticky 这个参数用于是否粘性操作(如果执行过,是否执行与上一次同样的操作)
- priority 优先级(优先级越高,越优先接收,但不影响接收,默认为0)
- 具体的注册方法有下面四个:
public void register(Object subscriber)
public void register(Object subscriber, int priority)
public void registerSticky(Object subscriber)
public void registerSticky(Object subscriber, int priority)
反注册(取消订阅)
这个操作是调用内部的私有方法:
public synchronized void unregister(Object subscriber)
发送消息
发送消息有两个方法,有了上面的介绍相信也不难理解
public void post(Object event)
public void postSticky(Object event)
顺带提一下,还有一个取消发送的方法
public void cancelEventDelivery(Object event)
这个方法可能会报四种错误:
- 1.这个方法只能在发送事件的线程调用
This method may only be called from inside event handling methods on the posting thread.
- 2.事件不能为空
Event may not be null
- 3.只能取消当前处理中的事件
Only the currently handled event may be aborted
- 4.只能取消传入的事件(未找到该事件)
event handlers may only abort the incoming event
四个订阅的方法
- onEvent:如果使用onEvent作为订阅函数,那么该事件在哪个线程发布出来的,onEvent就会在这个线程中运行,也就是说发布事件和接收事件线程在同一个线程。使用这个方法时,在onEvent方法中不能执行耗时操作,如果执行耗时操作容易导致事件分发延迟。
- onEventMainThread:如果使用onEventMainThread作为订阅函数,那么不论事件是在哪个线程中发布出来的,onEventMainThread都会在UI线程中执行,接收事件就会在UI线程中运行,这个在Android中是非常有用的,因为在Android中只能在UI线程中跟新UI,所以在onEvnetMainThread方法中是不能执行耗时操作的。
- onEventBackground:如果使用onEventBackgrond作为订阅函数,那么如果事件是在UI线程中发布出来的,那么onEventBackground就会在子线程中运行,如果事件本来就是子线程中发布出来的,那么onEventBackground函数直接在该子线程中执行。
- onEventAsync:使用这个函数作为订阅函数,那么无论事件在哪个线程发布,都会创建新的子线程在执行onEventAsync.
网友评论