当前位置:网站首页 > 技术博客 > 正文

android eventbus原理



EventBus:github

EventBus是Android和Java的发布/订阅事件总线。

  • 简化组件之间的通信
    • 在 Activities, Fragments, background threads中表现良好
    • 避免复杂且容易出错的依赖关系和生命周期问题
    解耦事件发送者和接收者

Android Projects:

 

Java Projects:

 
 

配置混淆文件

 

简单流程

  1. 创建事件类
 
  1. 在需要订阅事件的地方,声明订阅方法并注册EventBus。
 
 
  1. 提交订阅事件
 

Subcribe注解

Subscribe是EventBus自定义的注解,共有三个参数(可选):threadMode、boolean sticky、int priority。 完整的写法如下:

 

priority

priority是优先级,是一个int类型,默认值为0。值越大,优先级越高,越优先接收到事件。

值得注意的是,只有在post事件和事件接收处理,处于同一个线程环境的时候,才有意义。

sticky

sticky是一个boolean类型,默认值为false,默认不开启黏性sticky特性,那么什么是sticky特性呢?

上面的例子都是对订阅者 (接收事件) 先进行注册,然后在进行post事件。

那么sticky的作用就是:订阅者可以先不进行注册,如果post事件已经发出,再注册订阅者,同样可以接收到事件,并进行处理。

ThreadMode 模式

POSITING:订阅者将在发布事件的同一线程中被直接调用。这是默认值。事件交付意味着最少的开销,因为它完全避免了线程切换。因此,对于已知可以在很短时间内完成而不需要主线程的简单任务,推荐使用这种模式。使用此模式的事件处理程序必须快速返回,以避免阻塞发布线程(可能是主线程)。

MAIN:在Android上,订阅者将在Android的主线程(UI线程)中被调用。如果发布线程是主线程,将直接调用订阅者方法,阻塞发布线程。否则,事件将排队等待交付(非阻塞)。使用此模式的订阅者必须快速返回以避免阻塞主线程。如果不是在Android上,行为与POSITING相同。

MAIN_ORDERED:在Android上,订阅者将在Android的主线程(UI线程)中被调用。与MAIN不同的是,事件将始终排队等待交付。这确保了post调用是非阻塞的。

BACKGROUND:在Android上,订阅者将在后台线程中被调用。如果发布线程不是主线程,订阅者方法将在发布线程中直接调用。如果发布线程是主线程,EventBus使用一个后台线程,它将按顺序传递所有事件。使用此模式的订阅者应尽量快速返回,以避免阻塞后台线程。如果不是在Android上,总是使用一个后台线程。

ASYNC:订阅服务器将在单独的线程中调用。这始终独立于发布线程和主线程。使用此模式发布事件从不等待订阅者方法。如果订阅者方法的执行可能需要一些时间,例如网络访问,则应该使用此模式。避免同时触发大量长时间运行的异步订阅者方法,以限制并发线程的数量。EventBus使用线程池来有效地重用已完成的异步订阅者通知中的线程。

 
  • EventBus详解 (详解 + 原理)
  • 三幅图弄懂EventBus核心原理

版权声明


相关文章:

  • c stream写入文件2025-04-30 21:29:59
  • 树形组件2025-04-30 21:29:59
  • 双向链表是什么2025-04-30 21:29:59
  • 应急响应启动程序2025-04-30 21:29:59
  • 计算机毕业生就业方向2025-04-30 21:29:59
  • 无锁编程多线程 不用锁2025-04-30 21:29:59
  • 与门或门非门逻辑口诀2025-04-30 21:29:59
  • 线程间 通信2025-04-30 21:29:59
  • mstp网络结构2025-04-30 21:29:59
  • qt qfile read2025-04-30 21:29:59