【第五篇】androidEventbus源代码阅读和分析
分析 源代码 阅读 第五篇
2023-09-14 08:59:01 时间
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中去。
相关文章
- ITTC数据挖掘平台介绍(二) 微博数据挖掘和分析
- 如何用SPSS分析学业情绪量表数据
- 企业应如何培养数据驱动的分析文化?
- abap git - commnication failure错误消息的分析和定位
- atitit.自己动手开发编译器and解释器(1) ------词法分析--attilax总结
- SAP Spartacus UI 通过 HTTP Interceptor 给请求添加 Authorization 字段的源代码分析
- QuantitativeFinance:量化金融之金融时间序列分析之ES/ETS/GARCH模型的简介、Box-Jenkins方法-AR/MA/ARMA/ARIMA模型的简介及其建模四大步骤之详细攻略
- 音视频直播开发问题分析总结 -- 花屏&绿屏
- SRS4.0源代码分析之启动流程
- SRS4.0源代码分析之RTMP协议入门
- FFmpeg中的io分析
- Nginx源代码分析—业务流程
- 【Groovy】MOP 元对象协议与元编程 ( Groovy 类内部和外部分别获取 metaClass | 分析获取 metaClass 操作的字节码 | HandleMetaClass 注入方法 )
- Raw-OS源代码分析之消息系统-Queue_Size
- 从源代码角度分析ViewStub 疑问与原理
- STL 源代码分析 算法 stl_heap.h
- Android SystemUI源代码分析和修改
- 【E2LSH源代码分析】p稳定分布LSH算法初探
- ThreadPoolExecutor线程池的分析和使用
- 内核ppp编制和错误分析
- 认真分析mmap:what? why? how?
- Redis源代码分析(23)--- CRC循环冗余算法RAND随机数的算法
- ZYNQ - 嵌入式Linux开发 -11- ZYNQ7系列FSBL执行流程分析
- Anroid下usb分析usbmon(五)
- OBC功率分析--CSM数据采集系统来助力