EventBus的简单实现

首先从eventbus的订阅方法开始

  1. eventbus的接收方法有一个注解@Subscriber,无返回值,一个参数 创建一个Annotation,命名为Subscribe
  2. 定义此注解用在方法之上(@Target(ElementType.METHOD)),定义注解的生命周期为运行期(@Retention(RetentionPolicy.RUNTIME))
  3. 源码里有三个值,这里我定义一个ThreadMode(没创建)
  4. 创建ThreadMode enum类,五个属性
  5. POSTING,MAIN,MAIN_ORDERED,BACKGROUND,ASYNC
  6. 可以看出一个订阅方法有三个属性Method(方法),ThreadMede(线程模式),Class(方法的参数)
  7. 创建一个类为MethodManger添加以上方法,实现get,set方法,添加一个有参构造

EventBus注册

  1. 创建EventBus类
  2. 实现getDefault()方法,EventBus为单例
  3. 创建属性Map<Object, List> cacheMap;在无参构造实例化
  4. 实现注册方法register(Object getter)
  5. 查找cacheMap里是否存在,不存在则添加
  6. 已知key为getter,value是一个List>类型,因为订阅方法一个类可以存在多个
    定义一个方法findAnnotationMethod获取订阅方法
  7. 通过反射获取到Class
  8. Class.getMethod()获取到所有的方法
  9. 遍历Method
  10. 通过Method.getAnnotation()获取Subscribe注解,如果不存在就continue
  11. 找到对Method进行验证,返回值必须是void(getGenericReturnType()),参数只能有一个(
    method.getParameterTypes())不符合抛出异常
  12. 符合添加到cacheMap,直到Class.getSuperclass()为null

EventBus反注册
unRegister(Object obj)
cacheMap.remove(obj)

EventBus发送

  1. post(Object obj)
  2. 获取到所有key
  3. 遍历Key
  4. 根据key获取到value(List)
  5. 遍历Value
  6. 判断订阅方法的参数是否跟发送的方法一致
  7. 通过反射Method.invoke(类,方法参数)执行订阅方法

简单一个EventBus写完了
https://github.com/sxy6/EventBus_Mode/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值