【第五篇】androidEventbus源代码阅读和分析之unregister代码分析

简介: 代码里面注销eventbus一般我们会在onDestory里面这么写:  1 EventBus.getDefault().unregister(this);  然后走到unregister里面去看看: 1 /** 2 * @param subscrib...

代码里面注销eventbus一般我们会在onDestory里面这么写:

  1.  1 EventBus.getDefault().unregister(this); 
然后走到unregister里面去看看:
  1.  1 /**
     2      * @param subscriber
     3      */
     4     public void unregister(Object subscriber) {
     5         if (subscriber == null) {
     6             return;
     7         }
     8         synchronized (this) {
     9             mMethodHunter.removeMethodsFromMap(subscriber);
    10         }
    11     }

     


然后往 mMethodHunter . removeMethodsFromMap ( subscriber );里面走:
mSubcriberMap是存储的map集合;
CopyOnWriteArrayList<Subscription>是mSubcriberMap map集合的value,是个存储订阅者对象的list集合;
Subscription为 订阅者对象,包含订阅者和目标方法;
遍历订阅者对象的list集合,移除集合里面指定的Subscription引用;
如果 CopyOnWriteArrayList < Subscription >的list集合为null或者长度为0,从而从map中进行删除操作,操作就是先删除订阅者,继而删除map集合里面的内容,list和map相互关联。
 1  /**
 2      * remove subscriber methods from map
 3      * 
 4      * @param subscriber
 5      */
 6     public void removeMethodsFromMap(Object subscriber) {
 7        //获取map值value的list迭代器
 8         Iterator<CopyOnWriteArrayList<Subscription>> iterator = mSubcriberMap
 9                 .values().iterator();
10        //遍历集合
11         while (iterator.hasNext()) {
12             CopyOnWriteArrayList<Subscription> subscriptions = iterator.next();
13             //如果集合不为null
14               if (subscriptions != null) {
15                 List<Subscription> foundSubscriptions = new
16                         LinkedList<Subscription>();
17                 //Subscription 订阅者对象,包含订阅者和目标方法
18                 Iterator<Subscription> subIterator = subscriptions.iterator();
19                 while (subIterator.hasNext()) {
20                     //获取Subscription对象
21                     Subscription subscription = subIterator.next();
22                     // 获取引用
23                     Object cacheObject = subscription.subscriber.get();
24                     if (isObjectsEqual(cacheObject, subscriber)
25                             || cacheObject == null) {
26                         Log.d("", "### 移除订阅 " + subscriber.getClass().getName());
27                         //foundSubscriptions添加Subscription对象引用
28                         foundSubscriptions.add(subscription);
29                     }
30                 }
31                 // 移除该subscriber的相关的Subscription[即map集合里面值value里面指定的list的某一项,此处进行遍历删除]
32                 subscriptions.removeAll(foundSubscriptions);
33             }
34             // 如果针对某个Event的订阅者数量为空了,那么需要从map中清除
35             if (subscriptions == null || subscriptions.size() == 0) {
36                 iterator.remove();
37             }
38         }
39     }

 

相关文章
|
存储 前端开发 JavaScript
AntV X6源码探究简析
AntV是蚂蚁金服全新一代数据可视化解决方案,其中X6主要用于解决图编辑领域相关的解决方案,其是一款图编辑引擎,内置了一下编辑器所需的功能及组件等,本文旨在通过简要分析x6源码来对图编辑领域的一些底层引擎进行一个大致了解,同时也为团队中需要进行基于X6编辑引擎进行构建的图编辑器提供一些侧面了解,在碰到问题时可以较快的找到问题点。
383 0
|
5月前
|
编译器 C++
《Effective C++ 改善程序与设计的55个具体做法》 第一章 笔记
《Effective C++ 改善程序与设计的55个具体做法》 第一章 笔记
|
监控 NoSQL Linux
【五、深入浅出GDB调试器】如何修复程序bug或优化代码:gdb调试器的来龙去脉与debug全方位实战详解(一)
【五、深入浅出GDB调试器】如何修复程序bug或优化代码:gdb调试器的来龙去脉与debug全方位实战详解
736 0
【五、深入浅出GDB调试器】如何修复程序bug或优化代码:gdb调试器的来龙去脉与debug全方位实战详解(一)
反调试入门篇(1)——花指令
反调试入门篇(1)——花指令
|
存储 NoSQL IDE
【五、深入浅出GDB调试器】如何修复程序bug或优化代码:gdb调试器的来龙去脉与debug全方位实战详解(三)
【五、深入浅出GDB调试器】如何修复程序bug或优化代码:gdb调试器的来龙去脉与debug全方位实战详解
353 0
【五、深入浅出GDB调试器】如何修复程序bug或优化代码:gdb调试器的来龙去脉与debug全方位实战详解(三)
|
NoSQL Shell C语言
【五、深入浅出GDB调试器】如何修复程序bug或优化代码:gdb调试器的来龙去脉与debug全方位实战详解(二)
【五、深入浅出GDB调试器】如何修复程序bug或优化代码:gdb调试器的来龙去脉与debug全方位实战详解
439 0
【五、深入浅出GDB调试器】如何修复程序bug或优化代码:gdb调试器的来龙去脉与debug全方位实战详解(二)
|
移动开发 JSON 小程序
【小程序开篇】小程序架构和配置
【小程序开篇】小程序架构和配置
282 0
【小程序开篇】小程序架构和配置
|
Java 编译器 开发工具
程序的执行流程和开发工具介绍 - 第五课
程序的执行流程和开发工具介绍 - 第五课
173 0
程序的执行流程和开发工具介绍 - 第五课
|
Java Unix Linux
Java系统程序Bug解决方法论(一) - 教程简介
Java系统程序Bug解决方法论(一) - 教程简介
148 0
|
小程序 JavaScript Android开发
小程序基础库探究:说说formid生成的实现
小程序基础库部分功能的探究学习。
244 0