【第五篇】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     }
原文地址:https://www.cnblogs.com/androidsuperman/p/4679704.html