前言:
在以往的项目中,一般的监听事件,回调,activity之间的通信 与Frament的通信 我一般都是使用观察者模式。
1.写接口 传对象 设置方法回调。。。。。代码多 不够简洁。。所以决定使用EventBus
概念:
**EventBus**是一个Android端优化的publish/subscribe消息总线,简化了应用程序内各组件间、组件与后台线程间的通信。比如请求网络,等网络返回时通过Handler或Broadcast通知UI,两个Fragment之间需要通过Listener通信,这些需求都可以通过**EventBus**实现。
作为一个消息总线,有三个主要的元素:
Event:事件
Subscriber:事件订阅者,接收特定的事件
Publisher:事件发布者,用于通知Subscriber有事件发生
好了 不多话 直接撸代码
准备工作 直接build.grade依赖
在需要订阅的地方
在销毁的地方进行销毁
定义接受事件的类型和发生的线程(有四种形式)
接受类型是String 发送类型也应该 String 如果发送了一个对象 这里就接受不到信息
注意:在栈中(生命周期还存在的Activity和Fragment) 发送消息后 如果接受类型和发送类型一致,订阅的地方是都能收到事件。
好啦 接下来 说些简单的用法吧
1.在同一组件中发送和接受消息
就是这么的简单 订阅 发送事件 类型统一能接受到 不统一不行 接收到信息在哪个线程处理也是你喜欢的。。
2.用法二。上面是发送的String类型,但是我是建议传递的是一个自定义的对象,可以用对象来做标识,加个type 在接受的时候做判断 ,进行想处理的订阅的地方响应
3.在不同组件页面发送消息和接受消息和同一组件中是一致。。。。发送消息组件中不需要订阅和销毁 只需要调用,然后接受的处理就行咯
好啦 我的渣渣文章也写了接近尾声了 其实EcentBus使用起来很简单的 。。。。
接下来说下更多实用的效果:
一 前面说过在EventBus中有4种线程控制的方式: 现在来介绍一下吧、
1。POSTING:同步模式 很简单也就是 你是什么我就是什么 , 发送消息是什么线程,接受信息就到什么线程中,线程一致 你是在主线程中发送 我就在主线程中接受 ,你在子线程中发送 ,我也在和发送同一个子线程中接受
2.MAIN:主线程模式,无论发送事件是在那个线程发送,接收事件一定会在主线程中执行。这样刚好就解决了只能在主线程中更新UI的问题。。
3.BACKGROUND:后台线程模式,如果发送事件的是在主线程中发送,接收事件就会在新建一个子线程中执行。发送事件是在子线程中执行,接收事件就会在发送事件的子线程中执行,同一子线程。这种模式适合处理耗时任务。
4.ASYNC:新线程模式,无论发送事件是在何种线程执行,接收事件一定会新建一个子线程去接收。
在子线程中发送消息 4种线程的方式的结果如下。。代码就不上了 自己撸撸代码有感觉哦
二,优先级的问题
我们如果有场景 同一页面中需要有先后的事件处理方式,并且有关联的数据联系的话,可以设置订阅事件处理的优先级。通过设置每个接收事件方法的优先级@Subscribe(priority = 1)开控制接收方法的先后。。priority数值越大 优先级越大
三。粘性事件
在EventBus中 可以先发送事件 后在订阅 通过设置也能接收到信息 通过设置@Subscribe(sticky = true)去指定 发送的时候也必须是.postSticky()类型才行
四。拦截事件。。
可以在方法内通过cancelEventDelivery()截断事件的传递。。。。场景的话自己看需求咯
但是注意的是 接受到的线程中想取消事件 必须在Posting中 否则会报错的哦
五。速度提升(要关联apt在bulid中设置 大家自己去研究下吧)不过我在项目中也没有加 哈哈
哈哈哈 EventBus的使用和基本的方法也说完 我理解的不够透彻 欢迎大神们指点 文章中有说的不好的 或者有问题的可以提出来 大家一起学习进步 我就是个渣渣 说的不好 敬请原谅 。。。。
愿我们一起成长 一起努力 享受这Android的神奇之旅,为人生的旅途增加更多的风采。 谢谢!!!