2017-05-07 63 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