Android 泄漏金丝雀检测到Kotlin Singleton泄漏内存

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,

我正在使用此模式创建一个单例来帮助我进行firebase操作,但不幸的是,它正在泄漏内存,这是我的代码

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对象