【第五篇】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();}}}
相关文章推荐
- Android启动页面禁止退出 防止多次点击back键
- Android Studio如何导入Library工程,并实时更新
- Android调用WebService系列之KSoap2对象解析
- 【进阶android】Volley源码分析——Volley的流程
- Android Handler 异步消息处理机制的妙用 创建强大的图片加载类
- android学习记录(三)百度地图错误---只有一个电话显示帧,没有地图内容。
- Android学习笔记(0)
- MyBasketball 第一篇
- android bindService()
- android imageview围绕中心旋转动画
- 【Android】Android布局中实现圆角边框
- android电池驱动(四)(自用)
- 简单实现listview可选择的列表(不用重写adapter)
- android电池驱动(五)(自用)
- Android SwipeToDismiss:左滑/右滑删除ListView条目Item
- Android代码中动态设置图片的大小(自动缩放),位置
- android service详解
- Android电池驱动(二)(自用)
- Android 菜单(OptionMenu)大全
- android中空的view,可以设置为水平线