Eventbus的使用与原理解析

简单使用:
首先依赖eventbus
api ‘org.greenrobot:eventbus:3.2.0’
使用的方式很简单

在activity或者fragment中注册
EventBus.getDefault().register(this);
别忘记最后接触注册
EventBus.getDefault().unregister(this);
发送消息
EventBus.getDefault().post(msg)
接收消息
@Subscribe
public void  getMsg(EventMessage msg){
   
 }

这样eventbus就可以使用了接下来分析原理,按照上面的使用步骤挨个分析:首先分析注册的原理:

方法一
public void register(Object subscriber) {
   
	1.获取订阅的class类型对象
    Class<?> subscriberClass = subscriber.getClass();
    2.获取当前class类对象所订阅的方法集合查看方法二
    List<SubscriberMethod> subscriberMethods = subscriberMethodFinder.findSubscriberMethods(subscriberClass);
    synchronized (this) {
   
    3.遍历所有的方法合集,订阅事件 查看方法三
        for (SubscriberMethod subscriberMethod : subscriberMethods) {
   
            subscribe(subscriber, subscriberMethod);
        }
    }
}

方法二

List<SubscriberMethod> findSubscriberMethods(Class<?> subscriberClass) {
   
首先先从METHOD_CACH中获取,如果有直接返回,不执行接下来的方法
    List<SubscriberMethod> subscriberMethods = METHOD_CACHE.get(subscriberClass);
    if (subscriberMethods != null) {
   
        return subscriberMethods;
    }

    if (ignoreGeneratedIndex) {
   
    这块如果自定义了EventBusBuilder,就走这块不是我们关注的重点
        subscriberMethods = findUsingReflection(subscriberClass);
    } else {
   
    主要看这块
        subscriberMethods = findUsingInfo(subscriberClass);
    }
    if (subscriberMethods.isEmpty()) {
   
        throw new EventBusException("Subscriber " + subscriberClass
                + " and its super classes have no public methods with the @Subscribe annotation");
    } else {
   
        METHOD_CACHE.put(subscriberClass, subscriberMethods);
        return subscriberMethods;
    }
}
接下来看这个方法
private List<SubscriberMethod> findUsingInfo(Class<?> subscriberClass) {
   
// FindState辅助我们查找订阅方法的类,
    FindState findState = prepareFindState();
    //将我们订阅的类传递进去
    findState.initForSubscriber(subscriberClass);
    //findState.clazz就是上面initForSubscriber传递进去的类
    while (findState.clazz != null) {
   
    //获取我们订阅类的订阅方法信息
        findState.subscriberInfo = getSubscriberInfo(findState);
        //第一次为空
        if (findState.subscriberInfo != null) {
   
            SubscriberMethod[] array = findState.subscriberInfo.getSubscriberMethods();
            for (SubscriberMethod subscriberMethod : array) {
   
                if (findState.checkAdd(subscriberMethod.method, subscriberMethod.eventType)) {
   
                    findState.subscriberMethods.add(subscriberMethod);
                }
            }
        } else {
   
        //直接看这里
            findUsingReflectionInSingleClass(findState);
        }
        findState.moveToSuperclass();
    }
    // 将查找到的方法保存在了FindState实例的subscriberMethods集合中。然后使用subscriberMethods构建一个新的List<SubscriberMethod>并返回,最后释放掉findState
    return getMethodsAndRelease(findState);
}
/**
 * 作用:通过反射获取订阅方法的信息
 */
private void findUsingReflectionInSingleClass(FindState findState) {
   
    Method[] methods;
    try {
   
        // This is faster than getMethods, especially when subscribers are fat classes like Activities
        methods = findState.clazz.getDeclaredMethods();
    } catch (Throwable th) {
   
        // Workaround for java.lang.NoClassDefFoundError, see https://github.com/greenrobot/EventBus/issues/149
        try {
   
            methods = findState.clazz.getMethods();
        } catch (LinkageError error) {
    // super class of NoClassDefFoundError to be a bit more broad...
            String msg = "Could not inspect methods of " + findState.clazz.getName();
            if (ignoreGeneratedIndex) {
   
                msg += ". Please consider using EventBus annotation processor to avoid reflection.";
            } else {
   
                msg += 
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值