【发布时间】:2017-05-07 14:32:45
【问题描述】:
我需要帮助来追踪使用 Leak Canary 检测到的泄漏
我已将此class 作为将Views 保存为图像的库的一部分,并且leak canary 检测到我不确定如何修复或理解的泄漏。在我的演示应用程序中检测到泄漏,其中包含 1 Activity 和一个保存按钮。当单击按钮并退出应用程序时,检测发生
【问题讨论】:
标签: android memory-leaks leakcanary
我需要帮助来追踪使用 Leak Canary 检测到的泄漏
我已将此class 作为将Views 保存为图像的库的一部分,并且leak canary 检测到我不确定如何修复或理解的泄漏。在我的演示应用程序中检测到泄漏,其中包含 1 Activity 和一个保存按钮。当单击按钮并退出应用程序时,检测发生
【问题讨论】:
标签: android memory-leaks leakcanary
变化:
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 类的隐式引用,在本例中是您的活动
【讨论】:
static 嵌套类和 static 字段之间存在巨大差异。 “我应该采用哪种方法?” -- 通过构造函数(或设置器,如果您愿意)传递所有内容。
AsyncTask 搞定了吗?到目前为止,泄漏金丝雀没有检测到任何东西