试图在另一个Singleton中使用Singleton类,但是不知何故它给了我内存泄漏。

我该如何改善?

这是我的单例实现示例

class FirstSingletonClass(val context: Context) {
    companion object {
        @Volatile
        private var instance: FirstSingletonClass? = null

        fun getInstance(context: Context): FirstSingletonClass =
                instance ?: synchronized(this) {
                    instance ?: FirstSingletonClass(context).also { instance = it }
                }

    }

   private val sSingletonClass: SecondSingletonClass = Injection.provideSecondSingletonClass(context)
}

SecondSingletonClass块
class SecondSingletonClass(val context: Context) {
    companion object {
        @Volatile
        private var instance: SecondSingletonClass? = null

        fun getInstance(context: Context): SecondSingletonClass =
                instance ?: synchronized(this) {
                    instance ?: SecondSingletonClass(context).also { instance = it }
                }

    }

   private val fSingletonClass: FirstSingletonClass = Injection.provideFirstSingletonClass(context)
}

注入(inject)类
object Injection {
    fun provideSecondSingletonClass(context: Context): SecondSingletonClass = SecondSingletonClass.getInstance(context)
    fun provideFirstSingletonClass(context: Context): FirstSingletonClass = FirstSingletonClass.getInstance(context)
}

因此,当我初始化属性-private val sSingletonClassprivate val fSingletonClass时,会产生内存泄漏。但是,如果我将在功能块中的某个地方调用我的单例类,则效果很好。

那有可能实现我想要的吗?还是我应该明确使用它...

最佳答案

问题:您正在将Context实例传递到Singleton中,该上下文可能是 Activity ,服务等。这可能会使上下文泄漏。

解决方案:改用applicationContext

class FirstSingletonClass(val context: Context) {
    companion object {
        @Volatile
        private var instance: FirstSingletonClass? = null

        fun getInstance(context: Context): FirstSingletonClass =
            instance ?: synchronized(this) {
                instance ?: FirstSingletonClass(context.applicationContext).also { instance = it }
            }
    }

    private val sSingletonClass: SecondSingletonClass = Injection.provideSecondSingletonClass(context)
}

class SecondSingletonClass(val context: Context) {
    companion object {
        @Volatile
        private var instance: SecondSingletonClass? = null

        fun getInstance(context: Context): SecondSingletonClass =
            instance ?: synchronized(this) {
                instance ?: SecondSingletonClass(context.applicationContext).also { instance = it }
            }

    }

    private val fSingletonClass: FirstSingletonClass = Injection.provideFirstSingletonClass(context)
}

关于android - 单例用法在Kotlin中造成内存泄漏,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55521604/

10-09 05:59
查看更多