您的位置:首页 > 移动开发 > Android开发

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

2015-07-27 11:36 531 查看
代码里面注销eventbus一般我们会在onDestory里面这么写:EventBus.getDefault().unregister(this);然后走到unregister里面去看看:
/**
* @param subscriber
*/
public void unregister(Object subscriber) {
if (subscriber == null) {
return;
}
synchronized (this) {
mMethodHunter.removeMethodsFromMap(subscriber);
}
}
然后往 mMethodHunter.removeMethodsFromMap(subscriber);里面走:mSubcriberMap是存储的map集合;CopyOnWriteArrayList<Subscription>是mSubcriberMap map集合的value,是个存储订阅者对象的list集合;Subscription为订阅者对象,包含订阅者和目标方法;遍历订阅者对象的list集合,移除集合里面指定的Subscription引用;如果CopyOnWriteArrayList<Subscription>的list集合为null或者长度为0,从而从map中进行删除操作,操作就是先删除订阅者,继而删除map集合里面的内容,list和map相互关联。
  /*** remove subscriber methods from map** @param subscriber*/public void removeMethodsFromMap(Object subscriber) {//获取map值value的list迭代器Iterator<CopyOnWriteArrayList<Subscription>> iterator = mSubcriberMap.values().iterator();//遍历集合while (iterator.hasNext()) {CopyOnWriteArrayList<Subscription> subscriptions = iterator.next();//如果集合不为nullif (subscriptions != null) {List<Subscription> foundSubscriptions = newLinkedList<Subscription>();//Subscription 订阅者对象,包含订阅者和目标方法Iterator<Subscription> subIterator = subscriptions.iterator();while (subIterator.hasNext()) {//获取Subscription对象Subscription subscription = subIterator.next();// 获取引用Object cacheObject = subscription.subscriber.get();if (isObjectsEqual(cacheObject, subscriber)|| cacheObject == null) {Log.d("", "### 移除订阅 " + subscriber.getClass().getName());//foundSubscriptions添加Subscription对象引用foundSubscriptions.add(subscription);}}// 移除该subscriber的相关的Subscription[即map集合里面值value里面指定的list的某一项,此处进行遍历删除]subscriptions.removeAll(foundSubscriptions);}// 如果针对某个Event的订阅者数量为空了,那么需要从map中清除if (subscriptions == null || subscriptions.size() == 0) {iterator.remove();}}}

                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: