EventBus的笔记

(@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. 1.这个方法只能在发送事件的线程调用
 This method may only be called from inside event handling methods on the posting thread.
  1. 2.事件不能为空
Event may not be null
  1. 3.只能取消当前处理中的事件
Only the currently handled event may be aborted
  1. 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.

你可能感兴趣的:(EventBus的笔记)