2017-05-07 73 views
0

我需要帮助跟踪与泄漏金丝雀检测到泄漏我需要帮助理解与泄漏金丝雀检测到泄漏

我有此class作为库的一部分,节省了Views图像和leak canary有发现泄漏,我不知道如何解决或理解。在我的演示应用程序中检测到泄漏,其中包含带保存按钮的1 Activity。当点击该按钮,我退出该应用程序,检测happend

enter image description here

回答

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关键字)

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

目前的情况是,只要你的任务仍在运行,您的活动被泄露,因为:

  • 你通过AsyncSaveBitmapMediaScannerConnection.scanFile()作为回调对象

  • 回调目标将被MediaScannerConnection代码保留,直到扫描完成

  • AsyncSaveBitmap类不是static,所以它包含一个隐含它引用回外的Java类,在这种情况下是你的活动

+0

使类的静态要求我做在类的构造函数用,如果我想继续我的成员变量非它需要所有参数静态或我可以使静态成员变量也是静态的。我应该选择哪种方法? – Muddz

+0

@Muddz:“我可以让这些成员变量是静态的 - ”这会让他们自己泄漏。 “静态”嵌套类和“静态”字段之间存在巨大差异。 “我应该选择哪种方法?” - 通过构造函数(或者setter,如果你愿意的话)传递所有内容。 – CommonsWare

+0

我刚刚完成了更改:https://pastebin.com/1YAtXpeT 我现在用'AsyncTask'钉了它吗?到目前为止没有发现泄漏金丝雀 – Muddz