我正在尝试定位这个内存泄漏。
我有两个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);
我的onDestroy方法
@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
中,是的。 - user773737