EventBusSubscribe 注解分析 ( Subscribe 注解属性 | threadMode 线程模型 | POSTING | MAIN | MAIN_ORDERED | ASYNC)(代
Posted 韩曙亮
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了EventBusSubscribe 注解分析 ( Subscribe 注解属性 | threadMode 线程模型 | POSTING | MAIN | MAIN_ORDERED | ASYNC)(代相关的知识,希望对你有一定的参考价值。
一、Subscribe 注解属性
查看 Subscribe
注解的源码 , 其中定义了
3
3
3 个注解属性 ;
threadMode
注解属性 用于配置 线程模式 , 用于标明执行事件对应的方法处于的线程类型 , 默认是 ThreadMode.POSTING
类型 ;
sticky
注解属性用于配置粘性事件 ;
priority
注解属性用于配置事件处理的优先级 , 如果要处理的事件分先后顺序时 , 需要使用优先级进行配置 ;
package org.greenrobot.eventbus;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
public @interface Subscribe {
ThreadMode threadMode() default ThreadMode.POSTING;
/**
* 如果为true,则将最近的粘性事件 (posted with
* {@link EventBus#postSticky(Object)}) 传递到此订阅服务器(如果事件可用)。
*/
boolean sticky() default false;
/** 影响事件传递顺序的订户优先级。在同一传递线程({@link ThreadMode})中,
* 优先级较高的订阅者将在其他优先级较低的订阅者之前接收事件。默认优先级为0。
* 注意:优先级*不*影响具有不同{@link ThreadMode}的订阅服务器之间的传递顺序! */
int priority() default 0;
}
二、threadMode 线程模式 ( POSTING | MAIN | MAIN_ORDERED | BACKGROUND | ASYNC )
发布线程 : 调用 EventBus.getDefault().post()
发布消息的线程 ;
ThreadMode 线程模式 : 有
5
5
5 个可设置项 , POSTING
, MAIN
, MAIN_ORDERED
, BACKGROUND
, ASYNC
;
POSTING
模式 : 默认的最小开销处理方式 , 不进行线程切换 , 在哪个线程发送事件 , 就在哪个线程处理事件 ;- 如果使用该模式 , 不要处理耗时事件 , 否则会长时间阻塞发布事件的线程 ;
- 主线程发布消息 : 在主线程执行 ;
- 子线程发布消息 : 在子线程执行 ;
MAIN
模式 : 在主线程处理事件 , 如果在子线程发送消息 , 处理消息时会将线程切换成主线程 ;- 如果发送事件的线程是 主线程 , 则立刻调用消息处理事件 , 此时 主线程会阻塞 ;
- 如果发送事件的线程是 子线程 , 事件在队列中排队等待传递 , 不会阻塞发布线程 ;
MAIN_ORDERED
模式 : 在主线程处理事件 ; 不管是在主线程还是在子线程发布事件 , 事件都在队列中排队等待传递 , 都不会阻塞发布线程 ;BACKGROUND
模式 : 子线程模式 ;- 在 主线程 中发布事件 , 会将事件加入队列中 , 然后 通过线程池执行 ;
- 在 子线程 中发布事件 , 直接在该线程中调用事件处理方法 , 会阻塞发布线程 ;
ASYNC
模式 : 不管在哪个线程发布事件 , 都会将放入队列 , 通过线程池执行事件 ;
下面是 ThreadMode 的详细源码及注释 :
package org.greenrobot.eventbus;
/**
* 每个订户方法都有一个线程模式,该模式确定EventBus将在哪个线程中调用该方法。
* EventBus独立于发布线程处理线程。
*
* @see EventBus#register(Object)
* @author Markus
*/
public enum ThreadMode {
/**
* 订阅服务器将在发布事件的同一线程中直接调用。
* 这是默认设置。
* 事件传递意味着开销最小,因为它完全避免了线程切换。
* 因此,对于已知可以在很短时间内完成而不需要主线程的简单任务,这是推荐的模式。
* 使用此模式的事件处理程序必须快速返回,以避免阻塞发布线程(可能是主线程)。
*/
POSTING,
/**
* 在android上,订户将在Android的主线程(UI线程)中被调用。
* 如果发布线程是主线程,则将直接调用订阅者方法,从而阻塞发布线程。
* 否则,事件将排队等待传递(非阻塞)。使用此模式的订阅服务器必须快速返回以避免阻塞主线程。
* 如果不在Android上,其行为与{@link#POSTING}相同。
*/
MAIN,
/**
* 在Android上,订户将在Android的主线程(UI线程)中被调用。
* 与{@link#MAIN}不同,事件将始终排队等待传递。这确保post调用是非阻塞的。
*/
MAIN_ORDERED,
/**
* 在Android上,订阅者将在后台线程中被调用。
* 如果发布线程不是主线程,则将在发布线程中直接调用订阅方方法。
* 如果发布线程是主线程,EventBus将使用一个后台线程,该线程将按顺序传递其所有事件。
* 使用此模式的订阅者应尝试快速返回,以避免阻塞后台线程。
* 如果不在Android上,则始终使用后台线程。
*/
BACKGROUND,
/**
* 订户将在单独的线程中被调用。
* 这始终独立于发布线程和主线程。
* 发布事件从不等待使用此模式的订阅服务器方法。
* 如果订户方法的执行可能需要一些时间,例如网络访问,则订户方法应使用此模式。
* 避免同时触发大量长时间运行的异步订阅服务器方法,以限制并发线程的数量。
* EventBus使用线程池高效地重用已完成异步订户通知中的线程。
*/
ASYNC
}
以上是关于EventBusSubscribe 注解分析 ( Subscribe 注解属性 | threadMode 线程模型 | POSTING | MAIN | MAIN_ORDERED | ASYNC)(代的主要内容,如果未能解决你的问题,请参考以下文章
SpringBoot 高级 原理分析 -- @EnableAutoConfiguration 注解