一、什么事EventBus?
EventBus是一个Android端优化的publish/subscribe消息事件总线。
EventBus简化了应用程序内各组件间、组件与后台线程间的通信。
EventBus适用于项目的任何地方,主线程与子线程。
EventBus只能支持一个参数的消息传递!!!
但是官方的EventBus不能实现跨进程。这篇文章将手写一个EventBus并能实现跨进程。
二、目前通信方式的弊端分析:
1.设置接口通信;这种方式的适用性比较狭窄,会造成业务代码的耦合,接口不支持跨线程;
2.通过Handler:处理消息必须实例化一个Handler,也就是说必须持有Handler的引用,并且处理消息必须在handlerMessage方法里面,Handler支持跨线程;
3.通过BroadCast:不安全(凡是注册了Action都能收到),处理消息是在onReceiver,这个是主线程,因此不能处理非常多的耗时操作。BroadCast支持跨进程。
三、手写EventBus步骤:
在手写之前,我们先要了解EventBus本身的结构是什么样子的,此时我再用个现实中的例子来说明:大家都使用过Boss直聘(或者其他的招聘网站)找过工作,招聘网站里面有各种各样的公司急招的岗位,比如说我想通过boss直聘去找阿里公司的Android开发工程师的岗位,那么阿里公司首先要将自己需要的岗位信息提供给boss直聘,boss直聘也肯定不止有阿里这一家公司的岗位招聘信息,所以boss直聘里面肯定会有一张大的表格,记录着很多家公司的岗位信息,我这是通过Android这个关键字去boss直聘网站上进行搜索,就搜索到了一大把Android相关的岗位,这里的三个角色我-->发送消息;boss直聘-->EventBus中转站;阿里巴巴-->具体接收消息,“Android”这个搜索关键字就是“事件”;
3.1角色定位Subscribe
image.png
EventBus注解必不可少,用它来注解函数,指明这个函数具备接受消息的能力,ThreadMode表示接受消息的线程类型。
3.2角色定位SubscribeMethod
SubscribeMethod就相当于故事中的阿里公司提供的职位,这个”职位“有三个成员变量,分别是Method、ThreadMode、Class<?>
image.png
3.3角色定位EventBus
故事中提到EventBus相当于Boss直聘网站,它里面定义了一张总表,用来存储各家公司里面的各个岗位信息。
image.png
首先它有注册方法,注册就是将Class类中所有被Subscribe注解过的函数保存起来:
image.png
image.png
再者它有pos方法,就是传入一个Object的对象,然后发送出去:
image.png
四、手写的EventBus如何线程切换?
ThreadMode定义了接收方法是主线程还是子线程,但是如果执行post发送方法是在子线程,那如何处理呢?
处理大纲:
1.post发送方法在子线程---》接收方法在主线程:用Handler处理;
2.post发送方法在主线程---》接收方法在子线程:用线程池ExectuorService切换;
image.png
五、改造EventBus能支持跨进程通信
序列化与反序列化
Parcelable:Android层面,性能更高
Serviserble:Java层面,虽然简单,影响性能
Binder 和Parcal关系
Binder直接跟Native打交道
Binder相当于船,货物就相当于Parcal
实现EventBus跨进程通信需要结合AIDL,打比方说B进程想要调用A进程的EventBus.getDefault().post()方法去发送,但是两个进程间单例不再是有效的单例,数据也无法跨进程传输,但是Android层提供了Parcelable跨进程传输的对象,我们先定义两个parcelable的aidl文件(Request和Responce),然后创建两个类继承Parcelable(还是Request和Responce),我们通过这两个对象的传入传出操作,就能实现跨进程通信:
image.png
接下来请看下一章节内容!
网友评论