EventBus - 4 源码解析-2 subscribe注解/threadMode

EventBus - 4 源码解析-2 subscribe注解/threadMode_第1张图片

接下来看下@Subscribe的源码,

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
public @interface Subscribe {
    ThreadMode threadMode() default ThreadMode.POSTING;

    /**
     * If true, delivers the most recent sticky event (posted with
     * {@link EventBus#postSticky(Object)}) to this subscriber (if event available).
     */
    boolean sticky() default false;

    /** Subscriber priority to influence the order of event delivery.
     * Within the same delivery thread ({@link ThreadMode}), higher priority subscribers will receive events before
     * others with a lower priority. The default priority is 0. Note: the priority does *NOT* affect the order of
     * delivery among subscribers with different {@link ThreadMode}s! */
    int priority() default 0;
}

19行,线程模式。以下是ThreadMode的源码,

public enum ThreadMode {
    POSTING,
    MAIN,
    MAIN_ORDERED,
    BACKGROUND,
    ASYNC
    private ThreadMode(){ }
}

它是一个枚举类,
POSTING:默认的线程模式,表示在执行post事件操作的时候,线程它会直接调用订阅者的事件方法,这时不管该线程是否在主线程,还有一点需要注意的是,在主线程当中,你肯定不能做耗时操作。
MAIN:表示在主线程执行这个方法,当我们发布线程如果就在主线程当中,那么我们就可以直接调用订阅者的事件方法来处理,否则的话,我们需要通过我们前面所说的HandlerPoster来进行发送消息,来进行相应的Handler Message的处理。
BACKGROUND:表示在后台线程中执行相应的方法,如果发布线程不是在主线程中,那么你直接调用订阅者的事件处理函数肯定是不可以的,你一定要去启用我们唯一的后台线程去进行处理。后台线程由于是唯一的,所以说当事件发送的post超过一个的时候,它们会放在后台线程中去进行依次的处理。同时BACKGROUND也是利用BackgroundPoster来进行调度的。
ASYNC:不论发布线程是否在主线程,都会使用一个空线程进行处理。和BACKGROUND不同的是,ASYNC所有的线程都是相互独立的,它不会出现线程卡顿,

AsyncPoster 每次从线程队列中获取一个所说的pendingPost。
BackgroundPoster 它会把所有的队列全部取出来进行处理。
这也是两者的缺点和优势。


21行,表示是否有粘性事件。
粘性事件:事件消费者在事件发布之后才注册的也能接收到该事件的特殊类型。
粘性广播:Sticky Broadcast,在广播发送结束后会保存刚刚发送的广播。

AndroidEventBus会存储所有的Sticky事件。如果在某个事件不需要的时候,我们就会进行手动的移除。

23行,方法优先级,默认是0。



你可能感兴趣的:(开源框架源码解析)