Утечка памяти в Kotlin Singleton обнаружена Leak Canary - PullRequest
0 голосов
/ 08 октября 2018

Я использую этот шаблон для создания синглтона, чтобы помочь мне в операциях с 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

1 Ответ

0 голосов
/ 08 октября 2018

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()
...