添加到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/

10-10 10:14