一文彻底搞懂EventBus 3

阅读: 评论:0

一文彻底搞懂EventBus 3

一文彻底搞懂EventBus 3

ThreadMode可以指定的模式有:

  1. ThreadMode.POSTING:默认的线程模式,在哪个线程发送事件就在对应线程处理事件,避免了线程切换,效率高。
  2. ThreadMode.MAIN:如在主线程(UI线程)发送事件,则直接在主线程处理事件;如果在子线程发送事件,则先将事件入队列,然后通过 Handler 切换到主线程,依次处理事件。
  3. ThreadMode.MAIN_ORDERED:无论在哪个线程发送事件,都将事件加入到队列中,然后通过Handler切换到主线程,依次处理事件。
  4. ThreadMode.BACKGROUND:与ThreadMode.MAIN相反,如果在子线程发送事件,则直接在子线程处理事件;如果在主线程上发送事件,则先将事件入队列,然后通过线程池处理事件。
  5. ThreadMode.ASYNC:与ThreadMode.MAIN_ORDERED相反,无论在哪个线程发送事件,都将事件加入到队列中,然后通过线程池执行事件

好了,要想使用Eventbus,则要先注册它,看看如何使用

很简单吧,getDefault()其实就是一个单例模式,创建EventBus实例对象,并返回

public static EventBus getDefault() {

if (defaultInstance == null) {
synchronized (EventBus.class) {
if (defaultInstance == null) {
defaultInstance = new EventBus();
}
}
}
return defaultInstance;
}

没啥可说的,继续看register

先看图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RMmfkU4o-1650016916779)(/0/w/1280/h/960/ignore-error/1)]

再看代码

public void register(Object subscriber) {
Class<?> subscriberClass = Class(); // 获取传入的要注册类的字节码文件
List subscriberMethods =
subscriberMethodFinder.findSubscriberMethods(subscriberClass); // ->>分析1

synchronized (this) {

// 遍历订阅方法封装类的集合
for (SubscriberMethod subscriberMethod : subscriberMethods) {
subscribe(subscriber, subscriberMethod); // ->> 分析4
}
}
}

从上面的图可以看出,这个方法其实就是做了2件事

  1. 根据注册类的字节码文件,调用findSubscriberMethods方法,获取该注册类上的所有订阅方法的信息集合。
  2. 遍历这个信息集合,给2个map填充数据: subscriptionsByEventType可以根据event(事件类型,订阅方法上的参数类型)获取所有订阅方法信息集合。 typesBySubscriber可以根据这个注册类,获取这个注册类上所有的event事件类型。

/**

  • 分析1:findSubscriberMethods()
  • 作用:获取当前要进行注册类中的所有订阅方法,也就是找寻使用了Subscribe注解、有public修饰符、一个参数的方法
    */
    List findSubscriberMethods(Class<?> subscriberClass) {

// METHOD_CACHE: 是一个ConcurrentHashMap,key是要注册类的字节码文件,value是这个字节码文件里的所有订阅方法信息的集合,集合的元素是SubscriberMethod,它实际上就是订阅方法的信息类,包含Method对象、线程模式、事件类型、优先级、是否是粘性事等。
List subscriberMethods = (subscriberClass); // 这步实际上就是看看这个注册类的方法是否已经缓存了,缓存过就直接根据类返回
if (subscriberMethods != null) {
return subscriberMethods;
}

// EventBus是支持EventBusBuilder的,如果我们自定义了EventBusBuilder,则ignoreGeneratedIndex为true,否则为false,我们没自定义,所有看false
if (ignoreGeneratedIndex) {
subscriberMethods = findUsingReflection(subscriberClass);
} else {

// ->>分析2
subscriberMethods = findUsingInfo(su

本文发布于:2024-02-03 00:07:00,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170689002147356.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

上一篇:初识C语言
下一篇:Java进阶
标签:一文   EventBus
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23