1

我有一個activity這將啓動一個asynctask(稱爲WorkerClass)和來自的AsyncTask我添加BaseAdapterGridView防止我的內存泄漏

if(gallery == null || switchScaleMode == true) { 
      myWorkerClass = new WorkerClass(myActivity.this, width, scaleButtonText); 
      myWorkerClass.execute(); 
     } 

我從活動開始的AsyncTask Gallery是一個可繪製的列表,它在我的gridview中顯示圖像。我知道把整個活動環境放到另一個班是非常糟糕的。但是我需要它在WorkerClass(AsyncTask)中獲得2個視圖的訪問權限。因此,我的第一個問題是,如果我只是將2個視圖添加到WorkerClass而不是整個活動,是否會阻止我的內存泄漏?

爲什麼我知道我的應用程序內有內存泄漏?

我在DDMS我的應用程序進程開始更新堆,並得到以下結果:

在啓動時,直到完全加載:

enter image description here

對我來說,這看起來像一個HIGHT如果開機後內存使用率> 90%,則爲金額..

現在,當我旋轉我的設備幾次我得到這個:(通知:我僅在啓動時啓動WorkerClass並將適配器添加到GridView一次。因爲我不想每次用戶旋轉(時間消耗)時重新計算(獲取圖像等)。

enter image description here

所以,如果我一次又一次地轉動我的設備我得到的一個的AsyncTask內存溢出異常。即使我只開始一次..(所以必須有某種娛樂的對象,導致OOM ??)

我不明白的是,如果我做了一個氣相色譜按鈕GC在在DDMS我得到:

enter image description here

因此,這是使用我的進程的內存量有所增加?但不應該釋放使用內存的GC?

最後一個問題:我試圖使用eclipse中的MAT(Memory Analyzer Tool)。但這隻適用於在DDMS啓動我的應用程序後才起作用。如果我旋轉它幾次,然後採取Heap Dump「快照」日食不會做任何事情。沒有錯誤,但也沒有行動。我唯一注意到的是,我不能與下面的錯誤再次啓動Heap Dump

12-07 15:09:52.739: E/jdwp(1109): Failed sending b-req to debugger: Invalid argument (67536832 of 96983113) 
12-07 15:09:53.759: E/jdwp(1109): Failed sending reply to debugger: Try again 

請理解,我不什麼讓我的整個代碼公開。如果你特別告訴我你想看什麼,我會盡我所能。

更新

所以,現在我有一個堆轉儲一些旋轉後,這是輸出:

enter image description here

我實例的EditText和GridView在我的活動,在我WorkerClass。因爲這是我在WorkerClass中唯一需要的兩個視圖,以及爲什麼我會將我的Activity-Context設置爲WorkerClass

那麼它會解決我的問題是,如果僅在活動中聲明並實例化它們並將它們傳遞給WorkerClass

更新2

的DominatorTree:

enter image description here

+0

你是否正在處理你的drawable旋轉?此外,當你旋轉你可以忍受或停止你的異化? – Nazgul 2014-12-07 14:24:00

+0

@Nazgul旋轉之後,我將它們放到「新」可用屏幕大小。我不取消這個asynctask,但它只需要大約1秒鐘就完成了。所以如果開始旋轉asynctask的實例應該完成! – MMike 2014-12-07 14:27:23

+0

@Nazgul我的意思是我適合他們,但我不調整他們!如果縱向4圖像適合一行,在調整大小後,我可以將5個圖像放在一行中。 – MMike 2014-12-07 14:29:50

回答

0

分析你的轉儲好像問題後已加入的EditText的textwatchers。由於edittext中的監聽器被內部保存在一個數組列表中,所以他們會不斷追加到列表中導致泄漏。嘗試從edittext中刪除或清除所有偵聽器,然後再添加新的偵聽器。應該修復泄漏。