试图在另一个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 sSingletonClass
或private 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/