这段代码会导致Android中的内存泄漏吗

法耶兹C

我正在编写一个类,用于为多个活动缓存一些数据。期望该类对每个活动都通过初始化逻辑一次。但是,它也不应引起任何内存泄漏。

如果有人可以查看此代码以了解潜在的内存泄漏,将很有帮助。也欢迎其他评论。

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
        )
    }
}
马特乌斯·赫里奇(Mateusz Herych)

使用WeakReference很可能会防止您的代码在此处泄漏(尽管这取决于是否newData有对Context-的引用,我认为没有),维护一个保留Activity的集合几乎从来不是一个好主意,并且-通常(不是)设计不良的迹象。

尤其是在此类集合具有静态性质的情况下(例如您的情况)。只要您的应用进程有效(可能需要几天或更长的时间),它就会一直存在,并且每次用户导航到另一个Activity或执行配置更改时,它的大小都会增加使用可以缓解这种担忧WeakHashMap,但是无论如何它都不会使其成为更好的体系结构。

如果AbcManager每个Activity实例需要初始化一次,为什么不将其保留为一个字段呢?by lazy如果希望确保Activity在处于适当状态之前不要实例化它可能带有

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章