我试图查明这个内存泄漏。
我有两个SurfaceViews
和。我开始,然后导航到,然后按返回按钮返回到,然后我再次导航到。A
B
A
B
A
B
每次执行此操作时,我都可以看到分配的内存增加,最终会出现内存不足错误。
这是我从连接到B
内部导航到的方式SurfaceView
A
Context context = this.getContext();
Intent i =new Intent(context, StartCareer.class);
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
context.startActivity(i);
在这两种视图中,我都有很多位图绘图。在B
中,我找不到对 的任何引用A
,而我能想到的上下文之外的唯一引用是对我拥有的 Global 类的引用。我还在后台进行了一些分析。我想这可能是一百万种不同的东西
我在 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
Keeps 正在重新创建。这是在做什么。
@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);
}
}
假设每次视图失去或获得焦点时都会调用这些方法,这显然是错误的。我怎样才能重新组织它,使它不是?