添加到Disposable
的每个CompositeDisposable
将被CompositeDisposable
强引用,直到CompositeDisposable
被清除或处置。这将防止收集由订户(一次性)引用的强对象。
在添加到Disposable
之前,是否应该将所有WeakReference
包装到CompositeDisposable
中?或者只是忽略并让CompositeDisposable
在以后清除。
最佳答案
订阅时,上游强烈参考下游。
当上游没有完成任务时,最终的Disposable Observer仍然可以被该容器处理。
import io.reactivex.disposables.Disposable
import io.reactivex.exceptions.CompositeException
import io.reactivex.internal.disposables.DisposableContainer
import java.util.*
import kotlin.collections.ArrayList
class WeakDisposableContainer : DisposableContainer, Disposable {
private val container = WeakHashMap<Disposable, Any>()
@Volatile
private var disposed = false
override fun add(d: Disposable): Boolean {
if (!disposed) {
synchronized(this) {
if (!disposed) {
container[d] = Unit
return true
}
}
}
d.dispose()
return false
}
override fun remove(d: Disposable): Boolean {
if (delete(d)) {
d.dispose()
return true
}
return false
}
override fun delete(d: Disposable): Boolean {
if (disposed) return false
synchronized(this) {
if (disposed) return false
return container.remove(d) != null
}
}
override fun isDisposed(): Boolean = disposed
override fun dispose() {
clear()
disposed = true
}
fun clear() {
if (disposed) return
val d: Iterable<Disposable>
synchronized(this) {
if (disposed) return
d = ArrayList(container.keys)
container.clear()
}
val err = d.mapNotNull { catchThrowable { it.dispose() } }
if (err.isNotEmpty()) throw CompositeException(err)
}
}
inline fun catchThrowable(block: () -> Unit): Throwable? = try {
block()
null
} catch (e: Throwable) {
e
}
关于java - CompositeDisposable导致内存泄漏,直到清除或处置被调用?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54860343/