防止我的记忆泄漏

时间:2014-12-07 14:12:17

标签: android memory-leaks android-asynctask garbage-collection

我有activity启动asynctask(称为WorkerClass),从asynctask我添加BaseAdapter到我的GridView

我从我的Activity中启动AsyncTask:

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

图库是一个可绘制的列表,它在我的gridview中显示图像。我知道将整个活动上下文放到另一个类中真的很糟糕。但是我需要它来访问WorkerClass(AsyncTask)中的2个视图。所以我的第一个问题是,如果我只将2个视图放到WorkerClass而不是整个活动中,它会阻止我的内存泄漏吗?

为什么我知道我的应用内存有内存泄漏?

我在DDMS中为我的APP-Process启动了Update Heap并获得了以下结果:

在启动时直到完全加载:

enter image description here

对我来说,如果启动后有大约90%的内存使用量,这看起来很高。

现在,当我多次旋转设备时,我得到了这个:( 通知:我只启动WorkerClass并将适配器添加到GridView一次,在启动时因为每次用户轮换时都不想重新计算(获取图像等)(时间消耗)。

enter image description here

所以,如果我一次又一次地旋转我的设备,我会在AsyncTask中获得Out Of Memory异常。即使我只启动它一次..(所以必须有某种对象的重新创建导致OOM?)

我不明白的是,如果我通过DDMS中的按钮GC进行GC,我会得到:

enter image description here

那么我的进程使用的内存量有多少?但是GC不应该释放使用过的内存吗?

最后一个问题:我尝试使用eclipse中的 MAT (内存分析工具)。但这仅适用于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

我在我的Activity和我的WorkerClass中实例化EditText和GridView。因为这是我WorkerClass中仅需要的两个视图,以及为什么我将Activity-Context放到WorkerClass

所以它会解决我的问题是如果只在Activity中声明并实例化它们并将它们传递给WorkerClass

更新2

DominatorTree:

enter image description here

1 个答案:

答案 0 :(得分:0)

分析转储后,似乎问题是已添加到edittext的textwatchers。由于edittext中的侦听器内部保存在arraylist中,因此它们会一直附加到列表中,从而导致泄漏。尝试在添加新的侦听器之前从edittext中删除或清除所有侦听器。应该修复泄漏。