【第五篇】androidEventbus源代码阅读和分析
分析 源代码 阅读 第五篇
2023-09-14 09:00:31 时间
1,分析androidEventbus的注册源代码:
我们在使用androidEventbus的第一步是注册eventbus,如下代码:
-
EventBus.getDefault().register(this);
首先获取eventbus对象,采用单利模式实现获取对象:
Eventbus.java里面
public static EventBus getDefault() { if (sDefaultBus == null) { synchronized (EventBus.class) { if (sDefaultBus == null) { sDefaultBus = new EventBus(); } } } return sDefaultBus; }
然后是:
1 public void register(Object subscriber) { 2 if (subscriber == null) { 3 return; 4 } 5 synchronized (this) { 6 mMethodHunter.findSubcribeMethods(subscriber); 7 } 8 }
跟踪到mMethodHunter.findSubcribeMethods(subscriber);继续往下看:
mMethodHunter在代码头部注册:
-
1 /** 2 * the subscriber method hunter, find all of the subscriber's methods 3 * annotated with @Subcriber 4 */ 5 SubsciberMethodHunter mMethodHunter =newSubsciberMethodHunter(mSubcriberMap);
用于查找所有使用@subcriber的注解方法
然后我们跟到findSubcribeMethods(subscriber)里面看看:
遍历
1 public void findSubcribeMethods(Object subscriber) { 2 if (mSubcriberMap == null) { 3 throw new NullPointerException("the mSubcriberMap is null. "); 4 } 5 Class<?> clazz = subscriber.getClass(); 6 // 查找类中符合要求的注册方法,直到Object类 7 while (clazz != null && !isSystemCalss(clazz.getName())) { 8 final Method[] allMethods = clazz.getDeclaredMethods(); 9 for (int i = 0; i < allMethods.length; i++) { 10 Method method = allMethods[i]; 11 // 根据注解来解析函数 12 Subscriber annotation = method.getAnnotation(Subscriber.class); 13 if (annotation != null) { 14 // 获取方法参数 15 Class<?>[] paramsTypeClass = method.getParameterTypes(); 16 // 订阅函数只支持一个参数 17 if (paramsTypeClass != null && paramsTypeClass.length == 1) { 18 Class<?> paramType = convertType(paramsTypeClass[0]); 19 EventType eventType = new EventType(paramType, annotation.tag()); 20 TargetMethod subscribeMethod = new TargetMethod(method, eventType, 21 annotation.mode()); 22 subscibe(eventType, subscribeMethod, subscriber); 23 } 24 } 25 } // end for 26 // 获取父类,以继续查找父类中符合要求的方法 27 clazz = clazz.getSuperclass(); 28 } 29 }
然后再 subscibe(eventType, subscribeMethod, subscriber);方法里面的代码:
mSubcriberMap是个map集合
/** * the event bus's subscriber's map */ Map<EventType, CopyOnWriteArrayList<Subscription>> mSubcriberMap;
1 /** 2 * 按照EventType存储订阅者列表,这里的EventType就是事件类型,一个事件对应0到多个订阅者. 3 * 4 * @param event 事件 5 * @param method 订阅方法对象 6 * @param subscriber 订阅者 7 */ 8 private void subscibe(EventType event, TargetMethod method, Object subscriber) { 9 CopyOnWriteArrayList<Subscription> subscriptionLists = mSubcriberMap.get(event); 10 if (subscriptionLists == null) { 11 subscriptionLists = new CopyOnWriteArrayList<Subscription>(); 12 } 13 Subscription newSubscription = new Subscription(subscriber, method); 14 if (subscriptionLists.contains(newSubscription)) { 15 return; 16 } 17 subscriptionLists.add(newSubscription); 18 // 将事件类型key和订阅者信息存储到map中 19 mSubcriberMap.put(event, subscriptionLists); 20 }
到这里就可以看到register就是遍历所有注解@Subcriber的方法,并将事件类型key和订阅者信息存储在map中去。这点很类似eventbus代码中register,只不过eventbus是以以onEvent开头的方法去进行查找,而androideventbus是以@subcriber去进行遍历检索,但最终都是将事件类型key和订阅者信息存储在map中去。
相关文章
- python条件变量之生产者与消费者操作实例分析
- 【第七篇】androidEventbus源代码阅读和分析之发送粘性事件和接收粘性事件代码分析
- 【第六篇】androidEventbus源代码阅读和分析之unregister代码分析
- Tools - 源代码阅读分析工具Source Insight
- 【结巴分词资料汇编】结巴中文分词源码分析(2)
- 物联网时代制造企业对大数据的运用分析
- 用好阿里云分析型数据库大存储实例,大幅降低大数据应用成本
- 【第六篇】androidEventbus源代码阅读和分析之unregister代码分析
- django的RestFramework模块的源码分析
- Angular rxjs源代码分析:range(0, 10)的实现
- Android系统进程间通信(IPC)机制Binder中的Server启动过程源代码分析
- 数学建模学习(4):数据统计与分析之假设检验
- OpenStack_Swift源代码分析——Ring基本原理及一致性Hash算法
- MapReduce(十五): 从HDFS阅读本文的源代码分析
- caffe源代码分析--math_functions.cu代码研究
- 第6章7节《MonkeyRunner源代码剖析》Monkey原理分析-事件源-事件源概览-注入按键事件实例
- Android——4.2.2 源代码文件夹结构分析
- [SSD综述1.7] 固态存储市场发展分析与预测_固态存储技术发展方向(2022to2023)
- OpenStack_Swift源代码分析——Object-auditor源代码分析(1)
- 【Java收集的源代码分析】Hashtable源代码分析
- 电驴 emule 源代码分析 (1)
- 第二人生的源码分析(七十八)LLOSInfo类实现获取操作系统信息
- Rplidar学习(四)—— ROS下进行rplidar雷达数据采集源码分析
- 实验二、UML建模之用例分析与设计【PowerDesginer】
- Linux 如何迅速分析定位CPU性能瓶颈
- 【redis源码分析】Redis Sentinel 是如何实际解决分布式共识问题的
- 2021年全国职业院校技能大赛(中职组)网络安全竞赛试题——capture.pcapng数据包分析