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

代码里面注销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     }
时间: 2024-11-10 13:01:19

【第五篇】androidEventbus源代码阅读和分析之unregister代码分析的相关文章

【第五篇】androidEventbus源代码阅读和分析之发送粘性事件和接收粘性事件代码分析

代码里面发送粘性事件代码如下: // 发送Sticky事件 EventBus.getDefault().postSticky(new User("soyoungboy", "西安财经学院"), "soyoungboy"); 然后我们进入postSticky方法里面去: EventType 是什么? 该类是描述一个函数唯一性的对象,参数类型.tag两个条件保证了对象的唯一性.通过该类的对象来查找注册了相应类型和tag的所有订阅者{@see* Sub

【第四篇】androidEventbus源代码阅读和分析

1,分析androidEventbus的注册源代码: 我们在使用androidEventbus的第一步是注册eventbus,如下代码: EventBus.getDefault().register(this); 首先获取eventbus对象,采用单利模式实现获取对象: Eventbus.java里面 public static EventBus getDefault() { if (sDefaultBus == null) { synchronized (EventBus.class) { i

【第三篇】Volley图片加载之NetworkImageView代码分析

在Volley的使用之加载图片讲过使用NetWorkImageView进行图片加载的例子,本文着重讲解NetWorkImageView内部是如何实现的,以及Volley这个控件有什么特性. 1,通过几个构造方法,可见NetworkImageView并没有添加自己的自定义属性,而是继承自Imageview的自定义属性. 2,然后是setImageUrl(String url,ImageLoader imageLoader),第一个参数为网络图片url,第二个参数为Imageloader对象,一般我

比特币代码分析5 挖矿代码分析

本文描述矿工处理线程,通过本文学习,可以了解矿工挖矿的大致流程.主要包含挖矿费用交易的产生.当前交易池的打包处理,工作量证明等相关内容.流程图(参考网络)如下所示:. 矿工处理函数1.void ThreadBitcoinMiner(void* parg)2.{ vfThreadRunning[3] = true; CheckForShutdown(3); try { bool fRet = BitcoinMiner(); printf("BitcoinMiner returned %s\n\n\

业务系统的源代码阅读

<业务系统的开发模式>  是我对业务系统开发的总结. 本文总结业务系统的源代码阅读方法. 业务系统的源代码阅读: 1.  工程的代码组织结构: 按照业务模块划分: 按照组件模块划分: 2.  阅读工程的配置文件,可以获得该系统的一些重要信息: 3.  理解和熟悉工程中所使用到的技术及框架: 4.  熟悉该系统的数据库设计: 数据库是应用系统的关键导图: 5.  熟悉该系统的重要概念及业务实体: 6.  理清业务实体及关联,构建业务模型图.约束关系图; 7.  从重要业务操作.所参与项目相关的业

Android4.0图库Gallery2代码分析(二) 数据管理和数据加载

Android4.0图库Gallery2代码分析(二) 数据管理和数据加载 2012-09-07 11:19 8152人阅读 评论(12) 收藏 举报 代码分析android相册优化工作 Android4.0图库Gallery2代码分析(二) 数据管理和数据加载 一 图库数据管理 Gallery2的数据管理 DataManager(职责:管理数据源)- MediaSource(职责:管理数据集) - MediaSet(职责:管理数据项).DataManager中初始化所有的数据源(LocalSo

来试试这个来自静态代码分析工具PVS Studio提供C++的小测验吧

博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:来试试这个来自静态代码分析工具PVS Studio提供C++的小测验吧.

20154322 杨钦涵 Exp4 恶意代码分析

Exp4 恶意代码分析 Exp4 恶意代码分析 一.基础问题回答 (1)如果在工作中怀疑一台主机上有恶意代码,但只是猜想,所有想监控下系统一天天的到底在干些什么.请设计下你想监控的操作有哪些,用什么方法来监控. ①可以使用监控程序,帮助我们分析是否存在恶意代码 ②如第二个实验使用sysmon,监控几乎所有的重要操作,并可通过事件查看器中找到日志查看. (2)如果已经确定是某个程序或进程有问题,你有什么工具可以进一步得到它的哪些信息. ①利用wireshark动态分析程序动向. ②PE explo

恶意代码分析技术

1.恶意代码分析技术 恶意代码分析有两类方法:静态分析和动态分析.静态分析方法是在没有运行恶意代码时对其进行分析的技术,而动态分析方法则需要运行恶意代码,而这两类技术又进一步分析基础技术和高级技术. 1).静态分析技术基础技术 静态分析基础技术包括检查可执行文件但不查看具体指令的一些技术.静态分析基础技术可以确认一个文件是否是恶意的,提供有关其功能的信息,有时还会提供一些信息让你能够生成简单的网络特征码. 2).动态分析基础技术 动态分析基础技术涉及运行恶意代码并观察系统的行为,以移除感染,产生