Android 泄漏金丝雀检测到Kotlin Singleton泄漏内存
我正在使用此模式创建一个单例来帮助我进行firebase操作,但不幸的是,它正在泄漏内存,这是我的代码Android 泄漏金丝雀检测到Kotlin Singleton泄漏内存,android,memory-leaks,kotlin,leakcanary,Android,Memory Leaks,Kotlin,Leakcanary,我正在使用此模式创建一个单例来帮助我进行firebase操作,但不幸的是,它正在泄漏内存,这是我的代码 class FirebaseDataSource(private val db: FirebaseFirestore, private val firebaseAuth: FirebaseAuth, private val firebaseFunctions: FirebaseFunctions,
class FirebaseDataSource(private val db: FirebaseFirestore,
private val firebaseAuth: FirebaseAuth,
private val firebaseFunctions: FirebaseFunctions,
private val firebaseStorage: FirebaseStorage,
private val firebaseInstanceId: FirebaseInstanceId) {
companion object {
@Volatile
private var INSTANCE: FirebaseDataSource? = null
fun getInstance(db: FirebaseFirestore = FirebaseFirestore.getInstance(),
firebaseAuth: FirebaseAuth = FirebaseAuth.getInstance(),
firebaseFunctions: FirebaseFunctions = FirebaseFunctions.getInstance(),
firebaseStorage: FirebaseStorage = FirebaseStorage.getInstance(),
firebaseInstanceId: FirebaseInstanceId = FirebaseInstanceId.getInstance()
): FirebaseDataSource =
INSTANCE ?: synchronized(this) {
INSTANCE
?: FirebaseDataSource(db, firebaseAuth, firebaseFunctions, firebaseStorage, firebaseInstanceId).also { INSTANCE = it }
}
fun clearInstance() {
INSTANCE = null
}
}
}
我在这样的活动中使用它
private val firebaseDataSource = FirebaseDataSource.getInstance()
可以帮助我修复内存泄漏,甚至为FirebaseDataSource提供更好的设计。Kotlin具有顶级、线程安全的单例对象。为什么不试试这样的东西:
object FirebaseDataSource {
private val db: FirebaseFirestore = FirebaseFirestore.getInstance()
private val firebaseAuth: FirebaseAuth = FirebaseAuth.getInstance()
private val firebaseFunctions: FirebaseFunctions = FirebaseFunctions.getInstance()
private val firebaseStorage: FirebaseStorage = FirebaseStorage.getInstance()
private val firebaseInstanceId: FirebaseInstanceId = FirebaseInstanceId.getInstance()
fun doStuff() {
db.doStuff()
}
}
然后使用它
FirebaseDataSource.doStuff()
您从未分配给
实例
。你只会检查它是不是!=null,因此您可以创建新的垃圾邮件instances@Abdelrhman是什么让你相信你在泄漏内存?我确实在中分配了实例
。还有{INSTANCE=it}
arf,好吧,这很隐蔽,但应该可以正常工作,所以忽略我的评论。然而,您使用的是clearInstance
?好吧,至少从那个跟踪来看,它看起来要么没有被正确清理,要么是LeakCanary发出的错误警报。是的,如果我不想将参数传递给我的类,那就太好了,但如果我想,我认为我不能使用Kotlin对象