自定义简易EventBus
本章通过自定义一个简易的EventBus来了解EventBus的框架思路;
EventBus的设计思路是通过向内存中注册订阅者对象和订阅者方法并且将他们缓存起来,在Post的时候在缓存中查找,如果命中则通过反射机制调用订阅方法达到通知的目的;
通过 自定义以下几个步骤,一共4个类来了解实际的过程
初始化:
注册:
解绑:
Post:
反射类:

只定义1个主线程,1个后台线程;
注解类:

注解类省掉别的参数,只定义1个线程模式;
封装1个订阅方法类:

MyEventBus 主类
初始化:

双重锁检查生成单例模式的EventBus对象
注册流程:


注册的逻辑:
1:通过订阅者对象向缓存查询是否命中,命中返回
2:通过反射查找到订阅者的全部订阅方法,并且缓存起来
3:查询完本类继续 查询父类

1:反射查找全部方法
2:剔除非public 和static的方法
3:获取参数,仅当参数为1个的情况下继续
4:获取注解,根据注解的参数来封装1个订阅者方法(MySubScribeMehod)
5:订阅者对象和订阅者方法映射缓存在内存中
解绑过程:

通过订阅者查询内存中的订阅者方法列表,命中则移除;
Post流程:

遍历缓存列表,通过Post的事件去查询,如果命中了,则将命中的方法反射调用达到通知的目的;
注:isAssignableFrom 方法是对比2和类的类信息,继承关系也可命中;
反射调用的时候涉及到线程调度,接着看是如何进行线程的调度的;
先封装1个反射的方法



一 接收者要求在Main主线程
1:如果Post发布者是在主线程,直接反射调用
2:如果Post发布者是在子线程,通过Handler调用,我们只需要在初始化的时定义1 个Handler就好
二 接收者要求在子线程
1:如果Post发布者是在主线程,通过定义1个线程池,new1个线程来异步调用
2:如果Post发布者是在子线程,则直接反射调用即可
测试结果:




说明:本篇只是学习EventBus框架学习定义的1个简单的EventBus,每个流程都简单处理了,具体学习还要看EventBus源码;