首先从eventbus的订阅方法开始
- eventbus的接收方法有一个注解@Subscriber,无返回值,一个参数 创建一个Annotation,命名为Subscribe
- 定义此注解用在方法之上(@Target(ElementType.METHOD)),定义注解的生命周期为运行期(@Retention(RetentionPolicy.RUNTIME))
- 源码里有三个值,这里我定义一个ThreadMode(没创建)
- 创建ThreadMode enum类,五个属性
- POSTING,MAIN,MAIN_ORDERED,BACKGROUND,ASYNC
- 可以看出一个订阅方法有三个属性Method(方法),ThreadMede(线程模式),Class(方法的参数)
- 创建一个类为MethodManger添加以上方法,实现get,set方法,添加一个有参构造
EventBus注册
- 创建EventBus类
- 实现getDefault()方法,EventBus为单例
- 创建属性Map<Object, List> cacheMap;在无参构造实例化
- 实现注册方法register(Object getter)
- 查找cacheMap里是否存在,不存在则添加
- 已知key为getter,value是一个List>类型,因为订阅方法一个类可以存在多个
定义一个方法findAnnotationMethod获取订阅方法 - 通过反射获取到Class
- Class.getMethod()获取到所有的方法
- 遍历Method
- 通过Method.getAnnotation()获取Subscribe注解,如果不存在就continue
- 找到对Method进行验证,返回值必须是void(getGenericReturnType()),参数只能有一个(
method.getParameterTypes())不符合抛出异常 - 符合添加到cacheMap,直到Class.getSuperclass()为null
EventBus反注册
unRegister(Object obj)
cacheMap.remove(obj)
EventBus发送
- post(Object obj)
- 获取到所有key
- 遍历Key
- 根据key获取到value(List)
- 遍历Value
- 判断订阅方法的参数是否跟发送的方法一致
- 通过反射Method.invoke(类,方法参数)执行订阅方法
简单一个EventBus写完了
https://github.com/sxy6/EventBus_Mode/