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中删除或清除所有侦听器,然后再添加新的侦听器。应该修复泄漏。