我想使用new architecture components创建一个应用程序,并且已经设置了 View 和ViewModel。目前,我的应用程序在ViewModel中执行所有Firestore查询,并且在某种程度上可以正常工作。 Google recommends应该提供一个存储库,该存储库缓存一些数据并决定是否获取新数据。这对于我的应用程序非常有意义,因为在MainActivity中嵌套了多个Fragments和许多其他 Activity 。

我决定实现存储库,并为我的存储库创建了一个Kotlin对象(Singleton)。结果,我得到警告,我不应该在其中存储FirebaseFirestore实例,因为它包含一个Context字段(我需要一个实例来分配snapshotListeners)。

Do not place Android context classes in static fields; this is a memory leak (and also breaks Instant Run)

我完全理解此警告,但我想知道我应如何在我的应用程序中使用Firebase实现存储库模式,而又不会导致内存泄漏?由于Firebase和新的Architecure Components/Guidlines均来自Google,因此我认为它们的设计旨在协同工作,但经过一些研究后我无法弄清楚。

有谁知道用Firebase snapshotListeners实现存储库的有效方法吗?

最佳答案

自从我问这个问题已经有一段时间了。同时,我找到了解决此问题的好方法。最好的方法是利用存储库模式和依赖注入(inject)。
这意味着您有一个带有私有(private)字段firebaseFirestore的类,该类实现了定义所有数据库操作的接口(interface)(在我的情况下为RemoteRepository)。
该类本身通过依赖注入(inject)作为Singelton提供。

class FirebaseRepository : RemoteRepository {
   private val firebaseFirestore = FirebaseFirestore.getInstance()

   override suspend fun saveSomething(...) {
     ...
   }

   override suspend fun getSomething(id: String) : T {
     return ...
   }


}

关于Android MVVM App Architecture : How to set up FirebaseFirestore as Repository,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50537071/

10-12 03:33