【问题标题】:Do not place Android context classes in static fields (static reference to a class which has field mActivity pointing to Activity)不要将 Android 上下文类放在静态字段中(对具有指向 Activity 的字段 mActivity 的类的静态引用)
【发布时间】:2021-10-08 10:55:05
【问题描述】:

我有一个类,它保存不同活动使用的数据,并通过全局计时器更新数据。它还包含对当前活动的引用。

class AdsManager : ActivityLifecycleCallbacks
{
    private var mActivity : Activity? = null
    
    override fun onActivitySaveInstanceState(activity: Activity, outState: Bundle) { }
    override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle?) { }
    override fun onActivityStarted(activity: Activity) {
        if(activity is AppCompatActivity) {
            mActivity = activity
        }
    }
    override fun onActivityStopped(activity: Activity) { }
    override fun onActivityPaused(activity: Activity) { }
    override fun onActivityResumed(activity: Activity) { }
    override fun onActivityDestroyed(activity: Activity) { }
}

mActivity 用于例如显示RewardedAdsInterstitialAds

由于它在全球范围内使用,我已将其放入应用程序伴侣对象中。

class App : Application() {
    companion object {
        lateinit var adsManager: AdsManager
    }
    override fun onCreate() {
        super.onCreate()
        adsManager = AdsManager()
    }
}

但 lint 显示此警告

不要将 Android 上下文类放在静态字段中(静态 对具有字段 mActivity 指向的 AdsManager 的引用 活动);这是内存泄漏

如果用户关闭了一个活动,那么一个新活动就会启动,并且对旧活动的引用会被替换。那么这里怎么可能发生内存泄漏呢?有没有更好的解决方案?

更新

如果该字段像下面这样设置为非静态的,会有什么不同吗?

class App : Application() {
    lateinit var adsManager: AdsManager
    
    override fun onCreate() {
        super.onCreate()
        adsManager = AdsManager()
    }
}

仍然可以通过(application as App).adsManager 的任何活动访问它,但不再有 lint 警告。

【问题讨论】:

标签: android kotlin memory-leaks


【解决方案1】:

为什么要保留mActivity?所有回调函数都带有Activity作为第一个参数,告诉你正在创建/启动/恢复哪个Activity等。

保留 mActivity 会导致内存泄漏——当用户关闭 Activity 时,你的生命周期回调仍然保留对它的引用,因此它不会被视为“不再使用”并且不会被销毁。这是内存泄漏。

如果你真的需要mActivity,那你的设计就有问题了。

【讨论】:

  • mActivity 用于例如显示RewardedAds。当用户关闭一个活动时,会启动另一个活动并替换旧的引用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多