Rxjava CompositeDisposable 是用来管理disposable的容器,之前的用法是生成disposable的时候add到CompositeDisposable里面,在ondestroy的时候CompositeDisposable调用dispose注销。
CompositeDisposable dispose的源码中
public void dispose() {
if (!this.disposed) {
OpenHashSet set;
synchronized(this) {
if (this.disposed) {
return;
}
//标记为disposed
this.disposed = true;
set = this.resources;
this.resources = null;
}
this.dispose(set);
}
}
之后add的时候
public boolean add(@NonNull Disposable disposable) {
ObjectHelper.requireNonNull(disposable, "disposable is null");
// 已经被标记为disposed 所以不会进去
if (!this.disposed) {
synchronized(this) {
if (!this.disposed) {
OpenHashSet<Disposable> set = this.resources;
if (set == null) {
set = new OpenHashSet();
this.resources = set;
}
set.add(disposable);
return true;
}
}
}
// 直接走这里,传进来的disposable直接被dispose()
disposable.dispose();
return false;
}
所以
(这个字体真丑)
开发过程中遇到create出来的single在第二次进去之后死活调不到subscribe里面,查了2个小时才发现的。
如果CompositeDisposable 对象的生命周期比较长,后续还需要继续使用,就使用CompositeDisposable.clear()来代替。
作者:zxjhello
链接:https://www.jianshu.com/p/650a574a0cb0
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。