文章目录

  • 一、Subscribe 注解属性
  • 二、threadMode 线程模式 ( POSTING | MAIN | MAIN_ORDERED | BACKGROUND | ASYNC )

一、Subscribe 注解属性


查看 Subscribe 注解的源码 , 其中定义了 333 个注解属性 ;

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 线程模式 : 有 555 个可设置项 , 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
}

【EventBus】Subscribe 注解分析 ( Subscribe 注解属性 | threadMode 线程模型 | POSTING | MAIN | MAIN_ORDERED | ASYNC)相关推荐

  1. Netty和RPC框架线程模型分析

    <Netty 进阶之路>.<分布式服务框架原理与实践>作者李林锋深入剖析Netty和RPC框架线程模型.李林锋已在 InfoQ 上开设 Netty 专题持续出稿,感兴趣的同学可 ...

  2. Netty 和 RPC 框架线程模型分析

    https://www.infoq.cn/article/9Ib3hbKSgQaALj02-90y 1. 背景 1.1 线程模型的重要性 对于 RPC 框架而言,影响其性能指标的主要有三个要素: I/ ...

  3. SpringBoot系列三:SpringBoot基本概念(统一父 pom 管理、SpringBoot 代码测试、启动注解分析、配置访问路径、使用内置对象、项目打包发布)...

    声明:本文来源于MLDN培训视频的课堂笔记,写在这里只是为了方便查阅. 1.了解SpringBoot的基本概念 2.具体内容 在之前所建立的 SpringBoot 项目只是根据官方文档实现的一个基础程 ...

  4. 【IOC 控制反转】Android 事件依赖注入 ( 事件依赖注入具体的操作细节 | 获取 Activity 中的所有方法 | 获取方法上的注解 | 获取注解上的注解 | 通过注解属性获取事件信息 )

    文章目录 前言 一.获取 Activity 中的所有方法 二.获取方法上的注解 三.获取注解上的注解 四.通过注解属性获取相关事件信息 前言 Android 依赖注入的核心就是通过反射获取 类 / 方 ...

  5. 【Java 注解】自定义注解 ( 注解属性定义与赋值 )

    文章目录 一.自定义注解格式 二.注解本质分析 三.注解属性及类型 四.注解属性类型 五.注解属性赋值简化操作 一.自定义注解格式 分析 Java 中自带的 @Override 注解 , 源码如下 : ...

  6. 注解和反射详细笔记。自定义注解,元注解,内置注解。反射机制,Java Reflection,Java内存分析,反射操作注解,java.lang.reflect.Method,Class

    文章目录 注解 什么是注解 内置注解 元注解 自定义注解 反射机制 静态语言 vs 静态语言 Java Reflection 反射相关的主要API Class类 Java内存分析 创建运行时类的对象 ...

  7. Mybatis @Flush注解分析

    Mybatis @Flush注解分析 在看源码的的时候,发现了@Flush注解.之前没用过,于是就有了这篇文章 注意:这里的执行器的类型肯定是BatchExecutor 先来例子 @Testpubli ...

  8. 2.3.2 spring属性注入-注解注入-半注解注入-后序

    代码: spring属性注入-注解注入-半注解后序.zip - 蓝奏云文件大小:15.2 K|https://www.lanzouw.com/iCjbVvpvxaf 上一个博客的半注解是,一个类在xm ...

  9. java 字段映射注解_mybatis注解开发中实体属性和表字段不对应问题

    在项目的实际开发中,有可能会遇到实体类中的属性名与列名不相同,不能改但.导致不能自动装配值的问题,此时可以接合@Results.@Result.@ResultMap实现开发 1.@Results注解 ...

最新文章

  1. 如何做好网络推广中有关网站优化中内链搭建都有什么方法?
  2. ORA-20000 exec dbms_space 错误
  3. Java中的Runtime类详解
  4. window安装python3后怎么用pyspark_window10搭建pyspark(超级详细)
  5. 问题 1076: 内部收益率
  6. 程序员的成功是否有规律可循?
  7. Android之Intent传递数据
  8. 人少钱少需求多的新项目该怎么带?看到这篇我心里有底了!
  9. 轻量级OLAP(一):Cube计算
  10. 为什么大公司只喜欢招985 211?学历真的很重要?
  11. GlassFish下手动部署JSF程序
  12. Python使用XGBoost
  13. 《麦肯锡方法》第9章 头脑风暴-思维导图
  14. Android 系统源码以及结构
  15. 计算机截图工具无法运行,win7系统打开截图工具提示“截图工具当前未在计算机上运行”的解决方法...
  16. Unity实战篇 |制作一个跟随鼠标转向的 简易箭头指示标,包括 UI指向 和 3D指向标
  17. 无线通信学习笔记(三)
  18. Keys配置及使用说明
  19. 用电脑玩创造与魔法还要申请模拟器白名单?不存在的
  20. 爬虫Scrapy框架运用----房天下二手房数据采集

热门文章

  1. 【python基础】list操作相关:扩充、条件查找【IndexError: list assignment index out of range】...
  2. 对于python 3.x与python2.x中新型类的继承特性总结
  3. 前端开发需要掌握的SEO的知识点
  4. Dajngo admin使用
  5. 找到一本不错的Linux电子书,附《Linux就该这么学》章节目录。
  6. 拉格朗日乘子法学习[转载]
  7. 在CentOS7上部署.net core 控制台应用程序部署为后台服务
  8. Luogu P2920 时间管理【二分答案】
  9. SQL Server - DAC(Dedicated Administrator Connection)专用管理员连接
  10. 使用JMeter录制手机App脚本