CompositeDisposable 会导致内存泄漏,直到 clear 或 dispose 调用?

Disposable添加到遗嘱中的每个都被CompositeDisposable强烈引用,CompositeDisposable直到CompositeDisposable清除或处置。这将防止收集订阅者(一次性)强引用的对象。

我应该在添加DisposableWeakReference之前将所有内容包装起来CompositeDisposable吗?或者只是忽略并让CompositeDisposable将来清除。


一只萌萌小番薯
浏览 322回答 1
1回答

catspeake

订阅时上游对下游的强引用。当上游没有完成任务时,最终的Disposable Observer仍然可以被这个容器处理掉。import io.reactivex.disposables.Disposableimport io.reactivex.exceptions.CompositeExceptionimport io.reactivex.internal.disposables.DisposableContainerimport java.util.*import kotlin.collections.ArrayListclass WeakDisposableContainer : DisposableContainer, Disposable {&nbsp; &nbsp; private val container = WeakHashMap<Disposable, Any>()&nbsp; &nbsp; @Volatile&nbsp; &nbsp; private var disposed = false&nbsp; &nbsp; override fun add(d: Disposable): Boolean {&nbsp; &nbsp; &nbsp; &nbsp; if (!disposed) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; synchronized(this) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (!disposed) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; container[d] = Unit&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return true&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; d.dispose()&nbsp; &nbsp; &nbsp; &nbsp; return false&nbsp; &nbsp; }&nbsp; &nbsp; override fun remove(d: Disposable): Boolean {&nbsp; &nbsp; &nbsp; &nbsp; if (delete(d)) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; d.dispose()&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return true&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; return false&nbsp; &nbsp; }&nbsp; &nbsp; override fun delete(d: Disposable): Boolean {&nbsp; &nbsp; &nbsp; &nbsp; if (disposed) return false&nbsp; &nbsp; &nbsp; &nbsp; synchronized(this) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (disposed) return false&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return container.remove(d) != null&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }&nbsp; &nbsp; override fun isDisposed(): Boolean = disposed&nbsp; &nbsp; override fun dispose() {&nbsp; &nbsp; &nbsp; &nbsp; clear()&nbsp; &nbsp; &nbsp; &nbsp; disposed = true&nbsp; &nbsp; }&nbsp; &nbsp; fun clear() {&nbsp; &nbsp; &nbsp; &nbsp; if (disposed) return&nbsp; &nbsp; &nbsp; &nbsp; val d: Iterable<Disposable>&nbsp; &nbsp; &nbsp; &nbsp; synchronized(this) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (disposed) return&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; d = ArrayList(container.keys)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; container.clear()&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; val err = d.mapNotNull { catchThrowable { it.dispose() } }&nbsp; &nbsp; &nbsp; &nbsp; if (err.isNotEmpty()) throw CompositeException(err)&nbsp; &nbsp; }}inline fun catchThrowable(block: () -> Unit): Throwable? = try {&nbsp; &nbsp; block()&nbsp; &nbsp; null} catch (e: Throwable) {&nbsp; &nbsp; e}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java