このメモリリークを特定しようとしています。
と の 2 つ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
私が考えることができる唯一のコンテキスト外の参照は、私が持っているグローバル クラスへの参照です。また、バックグラウンドでいくつかの分析が行われています。それは何百万もの異なるものになる可能性があると思います
Eclipse で DDMS ビューを表示していますが、何を見ているのか、または繰り返され続ける正確なオブジェクトを見つける方法がわかりません。
DDMS Allocation Tracker の短期集中コース/チュートリアル、または私が間違っていることを指摘してくれる人を受け入れます。
追加情報:
に描画されているビットマップがいくつかあり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 を実行したところ、少なくとも 1 つのリークが見つかりました。マイ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);
}
}
ビューがフォーカスを失ったり取得したりするたびにこれらのメソッドが呼び出されると仮定すると、これは明らかに間違っているようです。そうならないようにこれを再編成するにはどうすればよいですか?