【问题标题】:How to properly ignore objects with expectWeaklyReachable如何使用 expectWeaklyReachable 正确忽略对象
【发布时间】:2021-03-22 10:01:39
【问题描述】:

其中一个第三方 SDK 通过保留对两个不同活动的引用导致我的应用程序出现内存泄漏。我试图用expectWeaklyReachable 忽略这些泄漏,这是我的设置:

这是我的设置:

val ignoredClasses = listOf(
    "com.example.MyLeakingActivity",
    "com.example.MyLeakingActivity2"
)

val watchersToInstall = AppWatcher.appDefaultWatchers(application, object : ReachabilityWatcher {
    override fun expectWeaklyReachable(watchedObject: Any, description: String) {
        if (ignoredClasses.contains(watchedObject::class.java.name)) return
        AppWatcher.objectWatcher.expectWeaklyReachable(watchedObject, description)
    }

})
AppWatcher.manualInstall(
    application = application,
    watchersToInstall = watchersToInstall
)

问题在于,使用此配置 LeakMemory 会报告这些活动中所有 Fragment 和 ViewModel 的内存泄漏!! (因为它们的宿主 Activity 仍在内存中)。我必须提供一个非常广泛的忽略列表,列出可以在这些活动中使用的所有 Fragment 和 ViewModel。

如何设置 LeakCanary 来解决这个问题?

【问题讨论】:

    标签: leakcanary


    【解决方案1】:

    您可能应该点名并羞辱第 3 方 SDK,并让他们修复漏洞。

    与此同时,一种解决方法可能是:

    • 如果watchedObject 是View 的实例,请调用View.getContext() 并检查它是否是不良活动的实例。
    • 如果watchedObject 是Fragment 的实例,请调用Fragment.getActivity() 并检查这是否是不良活动的实例。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-04-24
      • 1970-01-01
      • 2017-02-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-15
      • 1970-01-01
      相关资源
      最近更新 更多