CompositeDisposable
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相关推荐
- java disposable_rx-java – RxJava中的CompositeDisposable是什么
复合一次性使处理(认为提前取消更容易).假设您有一个活动同时发生多个api调用: var disposable = api.call1(arg1,arg2).subscribe(...) var di ...
- Rxjava源码分析之IO.Reactivex.CompositeDisposable
Rxjava 源码系列目录 Rxjava源码分析之IO.Reactivex.Observer Rxjava源码分析之IO.Reactivex.CompositeDisposable Rxjava源码分 ...
- 每天记录学习的新知识 : Disposable和CompositeDisposable
CompositeDisposable 一.Disposable 1.简介 2.调用 2.1.主动解除订阅 2.2.查询是否解除订阅 true 代表 已经解除订阅 2.3.栗子 2.4.取消订阅的操作 ...
- android 顺序执行任务
在项目中遇到这样的一种情况 想要让某些任务顺序执行 但是如果用多线程的话是无法保证顺序的 所以这里我就采用单线程的方式去处理 第一种方式 Rxjava 结合 Executors去先单线程执行 Exec ...
- RxJava2 / RxAndroid2的merge操作合并多个Observable
RxJava2/RxAndroid2的merge操作合并多个Observable RxAndroid2/RxJava2的merge操作合并若干个Observable为单个可观测的Observable, ...
- 2、Reactive Extensions for .NET(译)
本文转自:http://www.cnblogs.com/hebeiDGL/p/3405175.html 实验3-引入 .net 中的 events 到 Rx 目标:前面实验中的使用各种工厂构造方法创建 ...
- 动态代理之Rxjava/Retrofit应用实战
一.前言 今天这篇文章,是对项目中用到的MVP + RxJava + Retrofit的整个架构做了一个简化,抽离出其中最核心的部分编写的读取 Gank 中拉取新闻资讯的例子. 下面我们先介绍一个整个 ...
- Android 架构组件 - 让天下没有难做的 App
Google 为了帮助 Android 开发者更快更好地开发 App,推出了一系列组件,这些组件被打包成了一个整体,称作 Android Jetpack,它包含的组件如下图所示: 老的 support ...
- 一行代码快速搞定Flowable断点下载(下)
一行代码快速搞定Flowable断点下载(下) 其实这个主题对应的三篇文章真的真的非常难写,首先是感觉非常多人对于函数式编程不太熟悉,然后又有一些人对于kotlin不太熟悉.这就导致了,写这三篇文章的 ...
最新文章
- 快手上市,蚂蚁酸了!不含主管人均收益1500万,蚂蚁不能比
- MVC入门学习笔记(十)
- python客户端与服务器端通信数据库原理_python网络-HTTP协议(28)
- 关于内存流与字符串的转换
- 水瓶座的回顾-高贵的程序员
- 有趣的算法(七):3分钟看懂希尔排序(C语言实现)
- Raspbian 2019-06-20 发布
- css border 圆角气泡案例
- getmenuiteminfo无法读取内存_简单科普系列—内存为什么需要组双通道原理及其作用...
- c语言智能车跑道检测程序,智能小车的循迹方法与流程
- Oracle建表规范
- 《深入理解SPARK:核心思想与源码分析》一书正式出版上市
- 计算机网络实验一(常见服务和静态IP设置)
- 进店率、提袋率、客单价
- systemctl 是管制服务的主要工具
- python+vue+elementui花卉种植技术网站
- git 版本回退 git reset --hard HEAD
- 元宇宙基础设施五层级模型的关系作用与实力。
- 今日金融词汇---定量分析
- D - National Railway (DP)