我有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并获得了以下结果:
在启动时直到完全加载:
对我来说,如果启动后有大约90%的内存使用量,这看起来很高。
现在,当我多次旋转设备时,我得到了这个:( 通知:我只启动WorkerClass
并将适配器添加到GridView
一次,在启动时因为每次用户轮换时都不想重新计算(获取图像等)(时间消耗)。
所以,如果我一次又一次地旋转我的设备,我会在AsyncTask中获得Out Of Memory异常。即使我只启动它一次..(所以必须有某种对象的重新创建导致OOM?)
我不明白的是,如果我通过DDMS中的按钮GC
进行GC,我会得到:
那么我的进程使用的内存量有多少?但是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
请理解我不知道如何公开我的整个代码。如果你具体告诉我你想看到什么,我会尽我所能..
更新
所以现在我在一些旋转后得到了堆转储,这就是输出:
我在我的Activity和我的WorkerClass
中实例化EditText和GridView。因为这是我WorkerClass
中仅需要的两个视图,以及为什么我将Activity-Context
放到WorkerClass
。
所以它会解决我的问题是如果只在Activity中声明并实例化它们并将它们传递给WorkerClass
。
更新2
DominatorTree:
答案 0 :(得分:0)