【发布时间】:2013-01-31 07:28:29
【问题描述】:
我正试图查明这个内存泄漏。
我有两个SurfaceViews、A 和B。我开始A,然后导航到B,然后按返回按钮返回到A,然后我再次导航到B。
每次执行此操作时,我都可以看到分配的内存增加,最终我会收到内存不足错误。
这是我从连接到A 的SurfaceView 内部导航到B 的方法
Context context = this.getContext();
Intent i =new Intent(context, StartCareer.class);
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
context.startActivity(i);
在这两种视图中,我都有很多位图绘图。在B 中,我找不到对A 的任何引用,而我能想到的上下文之外的唯一引用是对我拥有的全局类的引用。我还在后台进行了一些分析。我想这可能是一百万种不同的东西
我在 Eclipse 上打开了 DDMS 视图,但我不确定我在看什么,或者如何找到不断重复的确切对象。
我会接受 DDMS 分配跟踪器上的速成课程/教程,或者有人指出我做错了什么。
附加信息:
我在SurfaceView 上绘制了一些位图。来自B 的示例如下:
////At class level
Bitmap rightB,leftB;
////In the constructor
rightB = Bitmap.createScaledBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.right), 100,75, true);
////In doDraw
canvas.drawBitmap(rightB, rbX, rbY, null);
还有我的 onDestroys
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
if (mThread.isAlive()){
mThread.setMenuRunning(false);
}
}
所以我运行了 MAT,至少发现了一个漏洞。我的Thread 不断被重新创建。
这是在做什么。
@Override
public void surfaceCreated(SurfaceHolder holder) {
loading=false;
if (!mThread.isAlive()){
mThread = new ViewThread(this);
mThread.setMenuRunning(true);
mThread.start();
}
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
if (mThread.isAlive()){
mThread.setMenuRunning(false);
}
}
假设每次视图失去或获得焦点时都会调用这些方法,这显然是错误的。我怎样才能重新组织它,使它不是?
【问题讨论】:
-
你有这些活动的位图吗?
-
在与他们关联的
SurfaceViews中,是的。 -
粘贴该代码和你的 onDestroys
-
这个 Global 类有什么作用?它是否包含对任何视图、可绘制对象、处理程序或类似内容的任何引用?静态变量呢?有许多常用对象将整个 Activity 上下文保存在内存中。
-
@Siddharth done @mkuech Global 类包含各种整数、字符串,哦,还有一个
Resources,它是从A的构造函数中设置的
标签: android memory-leaks