文章目录

  • 一、取消订阅
  • 二、取消订阅 unsubscribeByEventType 方法

一、取消订阅


【EventBus】EventBus 使用示例 ( 最简单的 EventBus 示例 ) 示例中 , 在 MainActivity 中调用

        // 取消注册EventBus.getDefault().unregister(this);

方法 , 取消订阅 ;

取消订阅是以对象为单位的 , 一旦调用了 EventBusunregister 方法 , 并传入 订阅者对象 , 则该订阅者对象中的所有 订阅方法 , 都会被 取消订阅 ;

在 【EventBus】EventBus 源码解析 ( 注册订阅者总结 | 从封装的数据结构角度分析 EventBus ) 博客中 , 介绍到注册订阅者 , 是将 事件参数类型 和 订阅者信息 添加到 Map<Class<?>, CopyOnWriteArrayList> subscriptionsByEventType 集合中 ;

那么取消订阅者 , 也是从 Map<Class<?>, CopyOnWriteArrayList<Subscription>> subscriptionsByEventType 集合中移除相应的数据 ;

如何根据 订阅者对象 找到对应的数据 , 就需要依靠 Map<Object, List<Class<?>>> typesBySubscriber 集合进行辅助查找 , 首先根据 Map<Object, List<Class<?>>> typesBySubscriber 集合 , 查找订阅者对象对应的 参数类型对象 ;

然后根据 参数类型对象 到 Map<Class<?>, CopyOnWriteArrayList<Subscription>> subscriptionsByEventType 集合中查找参数类型对应的 订阅者类 对应的订阅者方法 , 从上述集合中移除相应的 订阅者类及相关的订阅方法 , 即可完成 取消订阅的操作 ;

public class EventBus {/** 从所有事件类中注销给定订阅服务器。 */public synchronized void unregister(Object subscriber) {// 获取该对象中的所有订阅方法的参数类型集合 List<Class<?>> subscribedTypes = typesBySubscriber.get(subscriber);if (subscribedTypes != null) {for (Class<?> eventType : subscribedTypes) {// 根据参数类型 , 移除该对象中相应的订阅方法 unsubscribeByEventType(subscriber, eventType);}typesBySubscriber.remove(subscriber);} else {logger.log(Level.WARNING, "Subscriber to unregister was not registered before: " + subscriber.getClass());}}
}

二、取消订阅 unsubscribeByEventType 方法


unsubscribeByEventType 方法中 , 通过参数 Class<?> eventTypeMap<Class<?>, CopyOnWriteArrayList<Subscription>> subscriptionsByEventType 集合中获取 Subscription 集合列表 ;

然后检查 Subscription 列表中 订阅者对像 是否是 取消注册的对象 , 如果是 , 直接将相应的 Subscription 对象从列表中移除 ;

    /** 仅按事件类型更新订阅,不按订阅类型更新订阅!调用方必须更新typesBySubscriber。 */private void unsubscribeByEventType(Object subscriber, Class<?> eventType) {// 通过参数类型获取 Subscription 列表 List<Subscription> subscriptions = subscriptionsByEventType.get(eventType);if (subscriptions != null) {int size = subscriptions.size();for (int i = 0; i < size; i++) {Subscription subscription = subscriptions.get(i);// 检查 Subscription 列表中 订阅者对像 是否是 取消注册的对象// 如果是 , 直接将相应的 Subscription 对象从列表中移除if (subscription.subscriber == subscriber) {subscription.active = false;subscriptions.remove(i);i--;size--;}}}}

【EventBus】EventBus 源码解析 ( 取消订阅 )相关推荐

  1. 【EventBus】EventBus 源码解析 ( 注册订阅者 | 注册订阅方法详细过程 )

    文章目录 前言 一.EventBus 注册订阅者 二.注册订阅方法的具体过程 三.Subscription 类 前言 在上一篇博客 [EventBus]EventBus 源码解析 ( 注册订阅者 | ...

  2. Android 源码分析之 EventBus 的源码解析

    1.EventBus 的使用 1.1 EventBus 简介 EventBus 是一款用于 Android 的事件发布-订阅总线,由 GreenRobot 开发,Gihub 地址是:EventBus. ...

  3. Android之EventBus框架源码解析上(单例模式)

    转载请标明出处:[顾林海的博客] 个人开发的微信小程序,目前功能是书籍推荐,后续会完善一些新功能,希望大家多多支持! 前言 EventBus能够简化各组件间的通信,让我们的代码书写变得简单,能有效的分 ...

  4. Dubbo源码解析 —— Zookeeper 订阅

    作者:肥朝 原文地址:https://www.jianshu.com/p/73224a6c07bb 友情提示:欢迎关注公众号[芋道源码].????关注后,拉你进[源码圈]微信群和[肥朝]搞基嗨皮. 友 ...

  5. 【EventBus】EventBus 源码解析 ( 注册订阅者总结 | 从封装的数据结构角度分析 EventBus )

    文章目录 EventBus 中的重要数据类型 1.subscriptionsByEventType 集合 2.typesBySubscriber 集合 EventBus 中的重要数据类型 从几个关键的 ...

  6. 【EventBus】EventBus 源码解析 ( 注册订阅者总结 | EventBus 注册订阅者流程梳理 )

    文章目录 EventBus 注册订阅者流程梳理 EventBus 注册订阅者流程梳理 EventBus 注册订阅者流程梳理 : ① 在 客户端 调用 EventBus.getDefault().reg ...

  7. Android之EventBus框架源码解析下(源码解析)

    转载请标明出处:[顾林海的博客] 个人开发的微信小程序,目前功能是书籍推荐,后续会完善一些新功能,希望大家多多支持! 前言 EventBus是典型的发布订阅模式,多个订阅者可以订阅某个事件,发布者通过 ...

  8. 【EventBus】EventBus 源码解析 ( 注册订阅者 | 订阅方法 | 查找订阅方法 )

    文章目录 一.EventBus 注册订阅者 二.订阅方法 三.查找订阅方法 findSubscriberMethods 方法 四.查找订阅方法 findUsingInfo 方法 五.查找订阅方法 fi ...

  9. EventBus3.0源码解析

     本文主要介绍EventBus3.0的源码 EventBus是一个Android事件发布/订阅框架,通过解耦发布者和订阅者简化 Android 事件传递. EventBus使用简单,并将事件发布和 ...

最新文章

  1. 零基础参加java培训主要学什么
  2. 专访阿里云MVP王俊杰:开发者的超能力是用技术让世界更美好
  3. 【Linux】16.mdc挂载群晖NAS
  4. 32查运行内存的map文件_Linux进程间通信——内存共享映射
  5. 1个不为人知的 Jupyter notebook 使用技巧,今天分享出来。
  6. 对象集合中如何用对象的某个属性给对象排序?
  7. tomcat:sessionId生成机制导致tomcat启动过慢问题
  8. 广东人大常委会党组会议强调:要加快人工智能等领域的相关立法工作。【Python】
  9. dhcp软件_DHCP和DNS是什么 二者有何区别?
  10. 弧形面如何逆时针排序_环形导轨如何实现拐弯?
  11. 网络github_GitHub项目awesome-latex-drawing新增内容(四):绘制贝叶斯网络
  12. 利用boost获取时间并格式化
  13. 对计算机数字不敏感怎么解决,英语听力对数字不敏感的解决办法
  14. php wps导入数据库,金山的wps的表格怎样导入sqlserver2008数据库中??_wps excel表格怎么导入数据库...
  15. 泛函分析 06.03 线性算子的谱理论 - 有界自共轭线性算子的谱
  16. 减小app大小的方法——iOS开发用ImageOptim压缩png图片
  17. 如何用ps制作GIF动图
  18. InnoDB行格式(COMPACT,redundant)对比
  19. 智能红外遥控器(三):红外学习温湿度读取
  20. 【Pytorch Lighting】第 5 章:时间序列模型

热门文章

  1. MySQL备份恢复工具xtrabackup
  2. 设置winfrom窗体透明度,拖动,任务栏中显示窗体
  3. 日子过得真快,转眼就工作了4个月了
  4. c# 多线程多个参数
  5. 暑期周总结四(2018.7.30-2018.8.5)
  6. 单链表的几个基本操作
  7. 将方法定义在prototype上的好处
  8. 30分钟?不需要,轻松读懂IL
  9. 如何注册iClap账号?
  10. async/await的实质理解