【发布时间】: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 用于例如显示RewardedAds 或InterstitialAds。
由于它在全球范围内使用,我已将其放入应用程序伴侣对象中。
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