写点什么

滴 -EventBus 快速使用介绍 - 新手考驾照

作者:芝麻粒儿
  • 2022 年 7 月 11 日
  • 本文字数:2086 字

    阅读完需:约 7 分钟

滴-EventBus快速使用介绍-新手考驾照

👉关于作者

众所周知,人生是一个漫长的流程,不断克服困难,不断反思前进的过程。在这个过程中会产生很多对于人生的质疑和思考,于是我决定将自己的思考,经验和故事全部分享出来,以此寻找共鸣!!!专注于 Android/Unity 和各种游戏开发技巧,以及各种资源分享(网站、工具、素材、源码、游戏等)


👉即将学会

学会 EventBus 的定义事件,监听事件,发送事件,在项目中使用快速解耦,达到在项目开发过程中充满着开心。

👉背景

🙎小芝:小空,小空,EventBus 缘起何方啊。

🙈小空:她是由 greenrobot 组织贡献的一个基于观察者模式的 Android 事件发布/订阅轻量级框架,该组织还贡献了( greenDAO 和 ObjectBox 都是用于 Android 数据库创建与管理的框架)

🙎小芝:那我什么时候该用她呢?😝

🙈小空(😎):当我们进行项目开发时,往往需要程序的各组件、后台线程等等各种通信,比如子线程请求数据需要通知 UI,两个 Activity 或 Fragment 等等,如果项目越来越复杂,使用的 Handler Intent 的数据通信代码,会逐渐臃肿且高度耦合!使用 EventBus 可以简化各组件间的通信,大量减少这些冗余,深度解耦!

🙎小芝(😆):哇哇哇,那你快讲讲怎么使用吧。

👉实践过程

EventBus 要素有三

  • Event 事件。它可以是任意类型。 

  • Subscriber 事件订阅者。在 EventBus3.0 之前有所不同,如果感兴趣可以自查,在 3.0 之后事件处理的方法名可以随意取,不过需要加上注解 @subscribe(),并且指定线程模型,默认是 POSTING。 

  • Publisher 事件的发布者。我们可以在任意线程里发布事件,一般情况下,使用 EventBus.getDefault()就可以得到一个 EventBus 对象,然后再调用 post(Object)方法即可。

线程模式有四

  • POSTING (默认) 表示事件处理函数的线程跟发布事件的线程在同一个线程。 

  • MAIN 表示事件处理函数的线程在主线程(UI)线程,因此在这里不能进行耗时操作。

  • BACKGROUND 表示事件处理函数的线程在后台线程,因此不能进行 UI 操作。如果发布事件的线程是主线程(UI 线程),那么事件处理函数将会开启一个后台线程,如果果发布事件的线程是在后台线程,那么事件处理函数就使用该线程。 

  •  ASYNC 表示无论事件发布的线程是哪一个,事件处理函数始终会新建一个子线程运行,同样不能进行 UI 操作。 

新司机上路



打开 App 的 build.gradle,在 dependencies 中添加最新的 EventBus 依赖:


implementation 'org.greenrobot:eventbus:3.2.0
复制代码

第一步:定义事件类

他是通信过程的数据载体,用来传递数据,和实体类相似,下面这只是个简单的


public class MessageEvent { }
复制代码


第二步:注册事件



第三步:发送事件

EventBus.getDefault().post(new MessageEvent());

发送出去后,被 @Subscribe 注解的函数就会被调用;

回头看看 GitHub 首页的那张图,就很容易理解了



学习到这,足以满足我们大部分情况的模块通信需求,初次体验到这种便利性,尽情的在代码中飙车吧;

初级新司机进阶中级新司机

首先有一点注意的:



如图,官方把注册/反注册 写到了 onStart/onStop 中,你要注意页面跳转等等来回多次调用触发的问题,所以要根据项目情况写在合适的位置;

EventBus 的更多技能:

  • 在事件中传递数据

  • 发送黏性事件 Sticky Events

  • 指定事件接收线程

  • 接收事件的优先级别

  • 中止事件传递

  • 订阅者索引

传递数据,只需要在定义事件类中的构造函数,增加参数,并添加 set 和 get 方法




粘性事件

刚才咱们一直在说消息发送 和订阅者收到消息,注意这是先订阅后发送的,如果我想在消息发送完成之后,新注册订阅的订阅者也能收到之前发送的消息,这时候粘性 Sticky Event 出来了;

例如 一个 Activity,里面有多个 Fragment 都执行某一个事件,但我只初始化了 2 个 Fragment,当我 post 事件后,又初始化了 2 个 Fragment,也想收到消息,粘性事件就解决了这个问题;粘性事件不会只被消息一次就消失,而是一直存在系统中,直到被 removeStickyEvent 删除掉;当然要想实现必须满足 2 个要点: 

要点一:发送粘性事件,将 post 改为 postSticky 

EventBus.getDefault().postSticky(new MessageEvent("丿空名"));

要点二:订阅者要声明下 我能接收粘性事件: 代码中 @Subscribe 注解中的 sticky 值为 true,可以尽情的玩耍了; 

指定事件的接收线程

说完了粘性事件,再说一说那指定事件接受的线程, @Subscribe 里面还有几个属性,其中 threadMode 的能力就是制定线程,默认值 ThreadMode:POSTING,和发送事件在一个线程

ThreadMode 列表

  • ThreadMode.POSTING:和发送事件在同一个线程

  • ThreadMode.MAIN:主线程

  • ThreadMode.BACKGROUND:子线程

  • ThreadMode.ASYNC:异步线程

刚才说了 @Subscribe 有几个属性,其中 priority 是设置优先级别,也是有默认值的为 0; 自行设置数字,数值越大优先级越低,会越晚接受消息



有一点和有序广播类似,如果你在多个地方有订阅事件且优先级别不一样,高优先级的订阅者,可以终止向下传递事件。



恭喜自己渡过新司机阶段!下一步慢慢分析 EventBus 原理内容!

👉其他

📢作者:小空和小芝中的小空

📢转载说明-务必注明来源:https://www.infoq.cn/profile/DB2492B85795C4/publish

📢这位道友请留步☁️,我观你气度不凡,谈吐间隐隐有王者霸气💚,日后定有一番大作为📝!!!旁边有点赞👍收藏🌟今日传你,点了吧,未来你成功☀️,我分文不取,若不成功⚡️,也好回来找我。

发布于: 刚刚阅读数: 3
用户头像

芝麻粒儿

关注

尺有所短;寸有所长。 2020.08.29 加入

👑CSDN博客专家-华为云享专家-Android/Unity领域优质作者 🏅目前在模拟医学行业做Android/Unity双端开发 🏆微信公众号:【空名先生】 🏆QQ交流群:204918251或877807592

评论

发布
暂无评论
滴-EventBus快速使用介绍-新手考驾照_android_芝麻粒儿_InfoQ写作社区