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

614 阅读5分钟

这是我参与8月更文挑战的第5天,活动详情查看:8月更文挑战

👉关于作者

众所周知,人生是一个漫长的流程,不断克服困难,不断反思前进的过程。在这个过程中会产生很多对于人生的质疑和思考,于是我决定将自己的思考,经验和故事全部分享出来,以此寻找共鸣!!!
专注于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原理内容!

👉其他

📢作者:小空和小芝中的小空
📢转载说明:务必注明来源:芝麻粒儿 的个人主页 (juejin.cn)
📢欢迎点赞👍收藏🌟留言📝