滴-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://zhima.blog.csdn.net/
📢欢迎点赞👍收藏🌟留言📝
- 点赞
- 收藏
- 关注作者
评论(0)