EventBus源码分析
来源:互联网 发布:sql sever2012安装教程 编辑:程序博客网 时间:2024/05/16 07:53
s###创建EventBus
EventBus.getDefault() 通过这个方法获取一个默认的对象
public static EventBus getDefault() { if (defaultInstance == null) { synchronized (EventBus.class) { if (defaultInstance == null) { defaultInstance = new EventBus(); } } } return defaultInstance; }
使用单例设计模式来
private static final EventBusBuilder DEFAULT_BUILDER = new EventBusBuilder(); public EventBus() { this(DEFAULT_BUILDER); }
默认的是一个Build的内部类。主要看看里面的参数
EventBus(EventBusBuilder builder) { //订阅事件集合 subscriptionsByEventType = new HashMap<>(); //粘性事件 stickyEvents = new ConcurrentHashMap<>(); //订阅事件集合 typesBySubscriber = new HashMap<>();//主线程处理事件 mainThreadPoster = new HandlerPoster(this, Looper.getMainLooper(), 10); //background backgroundPoster = new BackgroundPoster(this); // 异步线程 asyncPoster = new AsyncPoster(this); indexCount = builder.subscriberInfoIndexes != null ? builder.subscriberInfoIndexes.size() : 0; //订阅者响应函数信息存储和查找类 subscriberMethodFinder = new SubscriberMethodFinder(builder.subscriberInfoIndexes, builder.strictMethodVerification, builder.ignoreGeneratedIndex); logSubscriberExceptions = builder.logSubscriberExceptions; logNoSubscriberMessages = builder.logNoSubscriberMessages; sendSubscriberExceptionEvent = builder.sendSubscriberExceptionEvent; sendNoSubscriberEvent = builder.sendNoSubscriberEvent; throwSubscriberException = builder.throwSubscriberException; eventInheritance = builder.eventInheritance; //线程池对象 executorService = builder.executorService; }
配置完基本的属性,来看注册
public void register(Object subscriber) {//得到这个注册类的class对象 Class<?> subscriberClass = subscriber.getClass(); //用于搜索这个注册对象所有注册的事件,以及这个事件的一些属性,比如运行线程,优先级,是否粘性。在订阅的类通过注解的方式来设置。 //这个方法返回一个注册方法的集合, List<SubscriberMethod> subscriberMethods = subscriberMethodFinder.findSubscriberMethods(subscriberClass); synchronized (this) { for (SubscriberMethod subscriberMethod : subscriberMethods) { subscribe(subscriber, subscriberMethod); } } }
SubscriberMethodFinder的实现
List<SubscriberMethod> findSubscriberMethods(Class<?> subscriberClass) { //首先判断缓存里面有没有存在,存在直接获取 List<SubscriberMethod> subscriberMethods = METHOD_CACHE.get(subscriberClass); if (subscriberMethods != null) { return subscriberMethods; } if (ignoreGeneratedIndex) { //主要是这个方法,通过反射来获取注册类的数据 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 { //根据类的class 来缓存注册方法 METHOD_CACHE.put(subscriberClass, subscriberMethods); return subscriberMethods; } }
private List<SubscriberMethod> findUsingReflection(Class<?> subscriberClass) { // FindState findState = prepareFindState(); findState.initForSubscriber(subscriberClass); while (findState.clazz != null) { findUsingReflectionInSingleClass(findState); findState.moveToSuperclass(); } 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 methods = findState.clazz.getMethods(); findState.skipSuperClasses = true; } //遍历方法 for (Method method : methods) { int modifiers = method.getModifiers(); if ((modifiers & Modifier.PUBLIC) != 0 && (modifiers & MODIFIERS_IGNORE) == 0) { Class<?>[] parameterTypes = method.getParameterTypes(); if (parameterTypes.length == 1) { Subscribe subscribeAnnotation = method.getAnnotation(Subscribe.class); if (subscribeAnnotation != null) { Class<?> eventType = parameterTypes[0]; if (findState.checkAdd(method, eventType)) { ThreadMode threadMode = subscribeAnnotation.threadMode(); //添加方法 findState.subscriberMethods.add(new SubscriberMethod(method, eventType, threadMode, subscribeAnnotation.priority(), subscribeAnnotation.sticky())); } } } else if (strictMethodVerification && method.isAnnotationPresent(Subscribe.class)) { String methodName = method.getDeclaringClass().getName() + "." + method.getName(); throw new EventBusException("@Subscribe method " + methodName + "must have exactly 1 parameter but has " + parameterTypes.length); } } else if (strictMethodVerification && method.isAnnotationPresent(Subscribe.class)) { String methodName = method.getDeclaringClass().getName() + "." + method.getName(); throw new EventBusException(methodName + " is a illegal @Subscribe method: must be public, non-static, and non-abstract"); } } }
到此为止SubscriberMethod都已经被保存,通过这个方法getMethodsAndRelease返回, 通过 METHOD_CACHE.put(subscriberClass, subscriberMethods);缓存注解方法。
subscribe()方法的实现
水平太菜实在看不下去了,等以后在慢慢学吧
0 0
- EventBus 2.4 源码分析
- EventBus源码注释分析
- EventBus框架源码分析
- EventBus源码分析
- EventBus源码分析
- EventBus 源码分析
- EventBus 源码分析
- EventBus的源码分析
- EventBus 3 源码分析
- EventBus 源码分析
- EventBus的源码分析
- EventBus源码分析
- EventBus源码分析
- EventBus源码分析
- EventBus源码分析
- EventBus 3.0 源码分析
- EventBus 3.0 源码分析
- EventBus源码分析
- 小白式ubuntu14.04在安装anacoda后造成的路径错误问题以及后续问题处理方法
- Android全屏设置
- Elasticsearch技术分享(一)
- 用树莓派制作低成本高清监控摄像机 [译]
- 左耳朵耗子 | 技术人员的发展之路
- EventBus源码分析
- linux驱动程序开发3
- 实验楼 git基本用法(上)
- 个人服务器有关mysql的安装与使用
- 判断输入的信息是否为空,如果为空,提示信息
- 【LeetCode】常用算法之回溯法
- 宏定义
- Java中如何将包中工具类进行打包导出做成jar文件
- python文件基础处理