dispose方法:

CompositeDisposable是多个Disposable的集合,这里测试CompositeDisposable在执行dispose方法后,对后续添加进来的事件是否有影响:

public class MainActivity extends AppCompatActivity {private CompositeDisposable disposable = new CompositeDisposable();protected void onCreate(Bundle savedInstanceState) {disposable.add(Observable.just(0).delay(1, TimeUnit.SECONDS).subscribe(n -> {Log.e(TAG, "receive event 0");}));disposable.dispose();Log.e(TAG, "isDisposed" + disposable.isDisposed());         //truedisposable.add(Observable.just(1).delay(100, TimeUnit.MICROSECONDS).subscribe(n -> {Log.e(TAG, "receive event 1");}));
}

测试发现,事件1无法正常被接收,即一旦CompositeDisposable执行了dispose方法,它就会进入isDisposed状态,后续添加进来新的disposable都会直接被dispose掉。但是如果时间1的延时足够小,还是可以收到事件1的,所以推测dispose方法是个异步方法;

clear方法:

如果想使CompositeDisposable只取消已经add的Disposable,而后续新添加的Disposable不受影响,可以使用clear方法
clear方法不只是简单地将原来添加的事件删除,而且还会dispose掉这些已添加的事件;

public class MainActivity extends AppCompatActivity {private CompositeDisposable disposable = new CompositeDisposable();protected void onCreate(Bundle savedInstanceState) {disposable.add(Observable.just(0).delay(1, TimeUnit.SECONDS).subscribe(n -> {Log.e(TAG, "receive event 0");}));disposable.clear();Log.e(TAG, "isDisposed" + disposable.isDisposed());       //falsedisposable.add(Observable.just(1).delay(100, TimeUnit.MICROSECONDS).subscribe(n -> {Log.e(TAG, "receive event 1");}));
}

测试可知clear方法不会影响后续Disposable正常接收事件;

CompositeDisposable源码:

public final class CompositeDisposable implements Disposable, DisposableContainer {OpenHashSet<Disposable> resources;volatile boolean disposed;@Overridepublic void dispose() {   //注意dispose和clear方法的对比if (disposed) {return;}OpenHashSet<Disposable> set;synchronized (this) {if (disposed) {return;}disposed = true;    //clear方法只是缺少了这句set = resources;resources = null;}dispose(set);           //这个方法会遍历set逐个dispose}public void clear() {     //clear方法和dispose方法非常相似,唯一的区别就在于,clear没有把disposed置为trueif (disposed) {return;}OpenHashSet<Disposable> set;synchronized (this) {if (disposed) {return;}set = resources;resources = null;}dispose(set);         //clear也会遍历set逐个dispose}@Overridepublic boolean add(@NonNull Disposable d) {ObjectHelper.requireNonNull(d, "d is null");if (!disposed) {                //如果没有不在disposed状态,就把d添加到set中,返回ture;synchronized (this) {if (!disposed) {OpenHashSet<Disposable> set = resources;if (set == null) {set = new OpenHashSet<Disposable>();resources = set;}set.add(d);return true;}}}d.dispose();               //如果已经在dispose状态了,直接dispose掉这个消息,并返回false;return false;}
}

CompositeDisposable相关推荐

  1. java disposable_rx-java – RxJava中的CompositeDisposable是什么

    复合一次性使处理(认为提前取消更容易).假设您有一个活动同时发生多个api调用: var disposable = api.call1(arg1,arg2).subscribe(...) var di ...

  2. Rxjava源码分析之IO.Reactivex.CompositeDisposable

    Rxjava 源码系列目录 Rxjava源码分析之IO.Reactivex.Observer Rxjava源码分析之IO.Reactivex.CompositeDisposable Rxjava源码分 ...

  3. 每天记录学习的新知识 : Disposable和CompositeDisposable

    CompositeDisposable 一.Disposable 1.简介 2.调用 2.1.主动解除订阅 2.2.查询是否解除订阅 true 代表 已经解除订阅 2.3.栗子 2.4.取消订阅的操作 ...

  4. android 顺序执行任务

    在项目中遇到这样的一种情况 想要让某些任务顺序执行 但是如果用多线程的话是无法保证顺序的 所以这里我就采用单线程的方式去处理 第一种方式 Rxjava 结合 Executors去先单线程执行 Exec ...

  5. RxJava2 / RxAndroid2的merge操作合并多个Observable

    RxJava2/RxAndroid2的merge操作合并多个Observable RxAndroid2/RxJava2的merge操作合并若干个Observable为单个可观测的Observable, ...

  6. 2、Reactive Extensions for .NET(译)

    本文转自:http://www.cnblogs.com/hebeiDGL/p/3405175.html 实验3-引入 .net 中的 events 到 Rx 目标:前面实验中的使用各种工厂构造方法创建 ...

  7. 动态代理之Rxjava/Retrofit应用实战

    一.前言 今天这篇文章,是对项目中用到的MVP + RxJava + Retrofit的整个架构做了一个简化,抽离出其中最核心的部分编写的读取 Gank 中拉取新闻资讯的例子. 下面我们先介绍一个整个 ...

  8. Android 架构组件 - 让天下没有难做的 App

    Google 为了帮助 Android 开发者更快更好地开发 App,推出了一系列组件,这些组件被打包成了一个整体,称作 Android Jetpack,它包含的组件如下图所示: 老的 support ...

  9. 一行代码快速搞定Flowable断点下载(下)

    一行代码快速搞定Flowable断点下载(下) 其实这个主题对应的三篇文章真的真的非常难写,首先是感觉非常多人对于函数式编程不太熟悉,然后又有一些人对于kotlin不太熟悉.这就导致了,写这三篇文章的 ...

最新文章

  1. 快手上市,蚂蚁酸了!不含主管人均收益1500万,蚂蚁不能比
  2. MVC入门学习笔记(十)
  3. python客户端与服务器端通信数据库原理_python网络-HTTP协议(28)
  4. 关于内存流与字符串的转换
  5. 水瓶座的回顾-高贵的程序员
  6. 有趣的算法(七):3分钟看懂希尔排序(C语言实现)
  7. Raspbian 2019-06-20 发布
  8. css border 圆角气泡案例
  9. getmenuiteminfo无法读取内存_简单科普系列—内存为什么需要组双通道原理及其作用...
  10. c语言智能车跑道检测程序,智能小车的循迹方法与流程
  11. Oracle建表规范
  12. 《深入理解SPARK:核心思想与源码分析》一书正式出版上市
  13. 计算机网络实验一(常见服务和静态IP设置)
  14. 进店率、提袋率、客单价
  15. systemctl 是管制服务的主要工具
  16. python+vue+elementui花卉种植技术网站
  17. git 版本回退 git reset --hard HEAD
  18. 元宇宙基础设施五层级模型的关系作用与实力。
  19. 今日金融词汇---定量分析
  20. D - National Railway (DP)

热门文章

  1. 华硕windows10怎么安装c语言,华硕x441sc笔记本u盘安装win10系统教程
  2. 如何摧毁程序员的效率?转自伯乐在线
  3. 遗传算法-matlab实现
  4. 美国波音在中国市场颗粒无收全靠美国市场遮羞,空客和中国商飞成赢家
  5. HTTPS 解决方案及优化实践
  6. 博客备份攻略(亲自实验绝对可行)
  7. mail.smtp.auth.ntlm.domain
  8. 无线键盘休眠后按键失效 - 解决方案
  9. 【Revit二次开发】外部事件(ExternalEvent)
  10. 毕业10年经历【转载】