EventBus分析

一、使用

1.注册

EventBus.getDefault().register(this); //this指代订阅者

2.订阅者定义接收方法

public void onEventMainThread(Object event) {
  //button.setText(event);  event>的类型自己定义
}

3.0版本改动:通过注解来指定接收方法

@Subscribe(threadMode = ThreadMode.MainThread)
public void <自己定义>(Object event) {
  //button.setText(event);
}

3.发送数据

EventBus.getDefault().post(result);

 

二、源码理解

知识点

  • 入口:单例模式,通过双重锁的模式创建对象
  • 注册:遍历订阅者类中方法,找出以@Subribe注解的方法,将方法信息保存的map中(CopyOnWriteArrayList)
  • post:通过event类型(发送和接收消息的类型要一致),从map中找到要回调的方法,然后根据指定的线程反射回调
  • 观察者模式、CopyOnWriteArrayList、ThreadLocal、注解、反射、单例

 

1、注册
  register()方法中调用SubscriberMethodFinder.java类的findSubscriberMethods集合,用于获取订阅者类中所包含的接收方法

private synchronized void register(Object subscriber, boolean sticky, int priority) {
  // 找到注册者中所有的接收方法
  List<SubscriberMethod> subscriberMethods = subscriberMethodFinder.findSubscriberMethods(subscriber.getClass());
  for (SubscriberMethod subscriberMethod : subscriberMethods) {
    subscribe(subscriber, subscriberMethod, sticky, priority);
  }
}

findSubscriberMethod

for (Method method : methods) {
  String methodName = method.getName();
  if (methodName.startsWith(ON_EVENT_METHOD_NAME)) {
    int modifiers = method.getModifiers(); // 获取方法的修饰 ,订阅者只能是public的,并且不能被final,static等修饰
    if ((modifiers & Modifier.PUBLIC) != 0 && (modifiers & MODIFIERS_IGNORE) == 0) {
      Class<?>[] parameterTypes = method.getParameterTypes();
      if (parameterTypes.length == 1) { // 参数类型有且只能有一个(采用bean)
        String modifierString = methodName.substring(ON_EVENT_METHOD_NAME.length());
        ThreadMode threadMode;
        if (modifierString.length() == 0) {
          threadMode = ThreadMode.PostThread;
        } else if (modifierString.equals("MainThread")) {
          threadMode = ThreadMode.MainThread;
        } else if (modifierString.equals("BackgroundThread")) {
          threadMode = ThreadMode.BackgroundThread;
        } else if (modifierString.equals("Async")) {
          threadMode = ThreadMode.Async;
        }

       


subcribe方法将获得的数据(方法名,参数类型,subscriber)封装到subscriptionsByEventType集合中


 
2、接收
  通过post(event)方法将参数even传递
  从内存中读取接收的方法名和even数据,通过反射机制执行该方法
  通过反射机制执行所要接收的方法(即onEventMainThread)

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值