我正在编写一个类,用于为多个活动缓存一些数据。期望该类对每个活动都通过初始化逻辑一次。但是,它也不应引起任何内存泄漏。
如果有人可以查看此代码以了解潜在的内存泄漏,将很有帮助。也欢迎其他评论。
class AbcManager private constructor(private val data : Abc) {
fun fromAbc(a : A) : B? = data.someMethod(a)
companion object {
private val abcManagerCache : MutableList<AbcManagerCacheItem> = mutableListOf()
fun of(context : Activity) : AbcManager {
val abcManagerFromCache = attemptFromCache(context)
if(abcManagerFromCache != null) return abcManagerFromCache
val newData = //some operation that uses the context
val abcManager = AbcManager(newData)
abcManagerCache.add(AbcManagerCacheItem(
context = WeakReference(context),
abcManager = abcManager
))
return abcManager
}
private fun attemptFromCache(context : Context) : AbcManager? {
abcManagerCache.forEach {
val contextFromCache = it.context.get()
if( null!= contextFromCache && context == contextFromCache) {
return it.abcManager
}
}
return null
}
private class AbcManagerCacheItem(
val context : WeakReference<Context>,
val abcManager : AbcManager
)
}
}
使用WeakReference
很可能会防止您的代码在此处泄漏(尽管这取决于是否newData
有对Context
-的引用,我认为没有),维护一个保留Activity的集合几乎从来不是一个好主意,并且-通常(不是)设计不良的迹象。
尤其是在此类集合具有静态性质的情况下(例如您的情况)。只要您的应用进程有效(可能需要几天或更长的时间),它就会一直存在,并且每次用户导航到另一个Activity
或执行配置更改时,它的大小都会增加。使用可以缓解这种担忧WeakHashMap
,但是无论如何它都不会使其成为更好的体系结构。
如果AbcManager
每个Activity
实例只需要初始化一次,为什么不将其保留为一个字段呢?by lazy
如果希望确保Activity
在处于适当状态之前不要实例化它,则可能带有。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句