2012-09-15 138 views
7

我使用了幾個大的drawable,我不知道如何管理內存泄漏。 我跟蹤了我的應用程序的堆大小,它不停止增長(作爲分配的內存)。Android Drawables內存泄漏

它特別是長大而不會減少的「字節數組(byte [])」類型。 (在Eclipse上的DDMS Heap視圖中)

我的應用程序由一個使用片段的活動組成。 這些片段正在顯示幾張大圖片。 我試圖將drawables回調設置爲null,將drawables設置爲null,當我彈出一個片段但堆不會減少時清除我的易失性緩存(這會阻止我的應用程序執行太多的磁盤IO操作)。實際上,每次我調用: Drawable.createFromResourceStream(context.getResources(),value,new FileInputStream(f),f.getName(),opts); 堆長大。我如何釋放記憶?

謝謝!

回答

6

當Java找到內存中由代碼引用的對象時,會發生內存泄漏,這會阻止垃圾收集器釋放此內存。 Android中的一個常見原因是引用Activity上下文而不是Application上下文。請確保您的上下文引用的應用程序(即使用getApplicationContext而不是使用this選中此video對內存泄漏的解釋,並檢查該question

+0

我引用了應用程序上下文,而不是活動場景,你認爲問題是,我的片段永遠不會被銷燬,他們泄露? – abecker

+0

也許,請在我的答案中查看視頻,瞭解如何使用SDK內存分析工具(MAT)查找正在泄漏的對象 –

+1

嘿!我解決了我的問題!實際上,我的片段被保存在內存中,並且它是我的靜態易失性緩存。我不知道爲什麼它有這種行爲。我創建了一個DrawableManager,當我創建一個片段時,它有多種方法從磁盤或網絡中檢索Drawable。當它將一個視圖傳遞給我的視圖時,它將它保存在一個靜態HashMap中(以便在我的其他片段中重用此緩存)。我只是讓我的HashMap沒有靜態(不能重用片段之間的易失性緩存)。我不知道爲什麼我的碎片被留在記憶中。 – abecker

2

這個問題似乎是回答,但是在一個帖子中羅曼蓋伊似乎有關,以獲得更多信息:Avoiding Memory Leaks

顯然,如果你(例如)通過使用setBackgroundDrawable *(因此將drawable連接到視圖)將一個drawable作爲背景圖像設置爲文本視圖,則更改方向(銷燬Activity並重繪UI)drawable仍然可以訪問舊的activity(在舊的activity被銷燬後),從而產生內存泄漏。

*(作爲一個側面說明 - setBackgroundDrawable一直deprecated since API level 16

+0

...而setBackgroundDrawable即使在API 24中仍由setBackground在內部調用。:) –