带你从源码解析EventBus

2024-06-23 04:08
文章标签 源码 解析 eventbus

本文主要是介绍带你从源码解析EventBus,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

  • 1EventBus的使用

    • 1.1如何注册

    • 1.2普及几个名词

    • 1.3如何使用

  • 2源码分析

  • 3方法的权限符

EventBus的使用

//注册订阅者

如何注册

//如何获取EventBus对象
第一种方式:推荐
EventBus.getDefault().register(this);//第一种方式获取EventBus对象
这种方式是通过系统的方式单例获取一个EventBus对象

public static EventBus getDefault() {if(defaultInstance == null) {Class var0 = EventBus.class;synchronized(EventBus.class) {if(defaultInstance == null) {defaultInstance = new EventBus();}}}return defaultInstance;
}

第二种方式:不推荐

EventBus build = EventBus.builder().build();

//第二种方式获取EventBus对象,这种不推荐,因为如果要是
用的话得自己去维护这个EventBus对象。不方便,因为消息的发送必须是一个EventBus对象

//将当前的MainActivity作为一个订阅者
EventBus.getDefault().register(this);
这就是将当前的MainActivity作为一个订阅者,(x消息接受者),subscribe

普及几个名词

先给大家普及几个名词

  1. Subscriber:事件订阅者,用于接收事件
  2. onEvent:发送者在哪个线程发送的,该方法也在哪个线程中处理事件
  3. onEventMainThread:不管发送者在哪个线程发送的,该方法都会在主线程中处理事件
  4. onEventBackgroundThread:如果发送者是在子线程发送的,那么该方法也在同一个子线程处理事件,如果发送者是在主线程,那么该方法在一个线程池中处理事件
  5. onEventAsync:不管发送者在哪个线程发送的,该方法都在线程池中执行

为了验证这个我们分别在主线程和子线程发送消息,看下四个回调方法的执行情况

下面是SecondActivity主线程发送消息的log

11-01 10:15:10.580 1065-1065/com.example.zew.eventbusdemo E/MainActivity: onEvent:ThreadName=main接受到了消息:com.example.zew.eventbusdemo.MyEvent1@ade61ae0
11-01 10:15:10.580 1065-1139/com.example.zew.eventbusdemo E/MainActivity: onEventAsync:ThreadName=pool-1-thread-1接受到了消息:com.example.zew.eventbusdemo.MyEvent1@ade61ae0
11-01 10:15:10.590 1065-1065/com.example.zew.eventbusdemo E/MainActivity: onEventMainThread:ThreadName=main接受到了消息:com.example.zew.eventbusdemo.MyEvent1@ade61ae0
11-01 10:15:10.590 1065-1140/com.example.zew.eventbusdemo E/MainActivity: onEventBackgroundThread:ThreadName=pool-1-thread-2接受到了消息:com.example.zew.eventbusdemo.MyEvent1@ade61ae0

我们可以看出 onEvent:ThreadName=main,因为发送者在哪个线程发送的,该方法也在哪个线程中处理事件

onEventMainThread:ThreadName=main因为不管发送者在哪个线程发送的,该方法都会在主线程中处理事件

onEventAsync:ThreadName=pool-1-thread-1,因为不管发送者在哪个线程发送的,该方法都在线程池中执行

下面是子线程发送消息的log

11-01 10:19:12.490 1065-2656/com.example.zew.eventbusdemo E/MainActivity: onEvent:ThreadName=Thread-70接受到了消息:com.example.zew.eventbusdemo.MyEvent1@adea0b58
11-01 10:19:12.490 1065-2656/com.example.zew.eventbusdemo E/MainActivity: onEventBackgroundThread:ThreadName=Thread-70接受到了消息:com.example.zew.eventbusdemo.MyEvent1@adea0b58
11-01 10:19:12.500 1065-1065/com.example.zew.eventbusdemo E/MainActivity: onEventMainThread:Th

这篇关于带你从源码解析EventBus的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1086184

相关文章

Java的栈与队列实现代码解析

《Java的栈与队列实现代码解析》栈是常见的线性数据结构,栈的特点是以先进后出的形式,后进先出,先进后出,分为栈底和栈顶,栈应用于内存的分配,表达式求值,存储临时的数据和方法的调用等,本文给大家介绍J... 目录栈的概念(Stack)栈的实现代码队列(Queue)模拟实现队列(双链表实现)循环队列(循环数组

java解析jwt中的payload的用法

《java解析jwt中的payload的用法》:本文主要介绍java解析jwt中的payload的用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Java解析jwt中的payload1. 使用 jjwt 库步骤 1:添加依赖步骤 2:解析 JWT2. 使用 N

Python中__init__方法使用的深度解析

《Python中__init__方法使用的深度解析》在Python的面向对象编程(OOP)体系中,__init__方法如同建造房屋时的奠基仪式——它定义了对象诞生时的初始状态,下面我们就来深入了解下_... 目录一、__init__的基因图谱二、初始化过程的魔法时刻继承链中的初始化顺序self参数的奥秘默认

Java 正则表达式URL 匹配与源码全解析

《Java正则表达式URL匹配与源码全解析》在Web应用开发中,我们经常需要对URL进行格式验证,今天我们结合Java的Pattern和Matcher类,深入理解正则表达式在实际应用中... 目录1.正则表达式分解:2. 添加域名匹配 (2)3. 添加路径和查询参数匹配 (3) 4. 最终优化版本5.设计思

使用Java将DOCX文档解析为Markdown文档的代码实现

《使用Java将DOCX文档解析为Markdown文档的代码实现》在现代文档处理中,Markdown(MD)因其简洁的语法和良好的可读性,逐渐成为开发者、技术写作者和内容创作者的首选格式,然而,许多文... 目录引言1. 工具和库介绍2. 安装依赖库3. 使用Apache POI解析DOCX文档4. 将解析

Java字符串处理全解析(String、StringBuilder与StringBuffer)

《Java字符串处理全解析(String、StringBuilder与StringBuffer)》:本文主要介绍Java字符串处理全解析(String、StringBuilder与StringBu... 目录Java字符串处理全解析:String、StringBuilder与StringBuffer一、St

Spring Boot循环依赖原理、解决方案与最佳实践(全解析)

《SpringBoot循环依赖原理、解决方案与最佳实践(全解析)》循环依赖指两个或多个Bean相互直接或间接引用,形成闭环依赖关系,:本文主要介绍SpringBoot循环依赖原理、解决方案与最... 目录一、循环依赖的本质与危害1.1 什么是循环依赖?1.2 核心危害二、Spring的三级缓存机制2.1 三

C#中async await异步关键字用法和异步的底层原理全解析

《C#中asyncawait异步关键字用法和异步的底层原理全解析》:本文主要介绍C#中asyncawait异步关键字用法和异步的底层原理全解析,本文给大家介绍的非常详细,对大家的学习或工作具有一... 目录C#异步编程一、异步编程基础二、异步方法的工作原理三、代码示例四、编译后的底层实现五、总结C#异步编程

MySQL中FIND_IN_SET函数与INSTR函数用法解析

《MySQL中FIND_IN_SET函数与INSTR函数用法解析》:本文主要介绍MySQL中FIND_IN_SET函数与INSTR函数用法解析,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友一... 目录一、功能定义与语法1、FIND_IN_SET函数2、INSTR函数二、本质区别对比三、实际场景案例分

Java图片压缩三种高效压缩方案详细解析

《Java图片压缩三种高效压缩方案详细解析》图片压缩通常涉及减少图片的尺寸缩放、调整图片的质量(针对JPEG、PNG等)、使用特定的算法来减少图片的数据量等,:本文主要介绍Java图片压缩三种高效... 目录一、基于OpenCV的智能尺寸压缩技术亮点:适用场景:二、JPEG质量参数压缩关键技术:压缩效果对比