【问题标题】:I need help to understand a leak detected with Leak canary我需要帮助来了解使用 Leak canary 检测到的泄漏
【发布时间】:2017-05-07 14:32:45
【问题描述】:

我需要帮助来追踪使用 Leak Canary 检测到的泄漏

我已将此class 作为将Views 保存为图像的库的一部分,并且leak canary 检测到我不确定如何修复或理解的泄漏。在我的演示应用程序中检测到泄漏,其中包含 1 Activity 和一个保存按钮。当单击按钮并退出应用程序时,检测发生

【问题讨论】:

    标签: android memory-leaks leakcanary


    【解决方案1】:

    变化:

    private class AsyncSaveBitmap extends AsyncTask<Void, Void, Void> implements MediaScannerConnection.OnScanCompletedListener
    

    到:

    static private class AsyncSaveBitmap extends AsyncTask<Void, Void, Void> implements MediaScannerConnection.OnScanCompletedListener
    

    (即,添加 static 关键字)

    这将需要对您的onScanCompleted() 实现进行一些后续更改,这目前依赖于AsyncSaveBitmap 不是static 的事实,调用您的活动的responseListener() 方法。

    就目前而言,只要您的任务仍在运行,您的活动就会泄露,因为:

    • 您将AsyncSaveBitmap 作为回调对象传递给MediaScannerConnection.scanFile()

    • 回调对象将被MediaScannerConnection 代码持有直到扫描完成

    • AsyncSaveBitmap 类不是 static,因此它包含对外部 Java 类的隐式引用,在本例中是您的活动

    【讨论】:

    • 使类成为静态需要我在该类中创建一个带有所有参数的构造函数,如果我想让我的成员变量保持非静态,或者我也可以将这些成员变量设为静态。我应该采用哪种方法?
    • @Muddz:“我可以将这些成员变量设为静态”——这会使它们本身泄漏。 static 嵌套类和 static 字段之间存在巨大差异。 “我应该采用哪种方法?” -- 通过构造函数(或设置器,如果您愿意)传递所有内容。
    • 我刚刚完成了更改:pastebin.com/1YAtXpeT 我现在用AsyncTask 搞定了吗?到目前为止,泄漏金丝雀没有检测到任何东西
    • 我注意到这种新方法会在我每次保存图像时分配内存,并且每次保存都会增加大约 20 mb 的内存,直到内存耗尽。在它刚刚达到 47 mb 之前,在保存图像时再次下降到 28 mb 分配
    • @Muddz:“我现在用 AsyncTask 搞定了吗?” - 我看不到您在哪里泄漏活动。关于你的新内存泄漏,生成一个堆转储并查看你持有的内容。
    猜你喜欢
    • 2019-03-13
    • 2020-08-29
    • 1970-01-01
    • 2023-03-20
    • 2012-11-27
    • 1970-01-01
    • 1970-01-01
    • 2011-08-07
    • 1970-01-01
    相关资源
    最近更新 更多