8

だから私は、私がすべてでMAT複数を作成し続けていることを発見しましたThreadssurfaceCreate

ただし、これらのスレッドが必要だと思いますが、この方法ではViewThread、ユーザーがアプリをナビゲートするときに の複数のインスタンスが発生し、メモリ リークが発生します。

これが発生しないように、スレッドの作成方法と処理方法を再編成するにはどうすればよいですか? または、リークの発生を防ぐにはどうすればよいですか?

@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);
    }
}

Careerゲームのアクティビティを 5 回開いて別の場所に移動しましたが、これがMAT

リーク

surfaceDestroyed編集:それ以来、スレッドの破壊に依存することは信頼できないことがわかりました。ここで、トリガーされた別のメソッドから適切なスレッド破壊呼び出しを呼び出しますonPause

4

3 に答える 3

4

You should use a WeakReference to reference the Career in your Thread. This way the reference will be cleared when there are no more hard references to the Career.

You can track all references in MAT by right clicking the career and choosing Path To GC Roots, then with all references. This will show you the path(s) to the object retained in memory. Make sure you either clear those references when you are done with the activity or make use of WeakReferences to have the GC clear them automatically.

于 2013-02-07T08:22:37.777 に答える
1

内部surfaceDestroyedでは、スレッドが停止したことを確認してから戻る必要があります

詳細については、この質問を参照してください。

@Override
public void surfaceDestroyed(SurfaceHolder holder) {
    boolean retry = true;
    mThread.setRunning(false);
    while (retry) {
        try {
            mThread.join();
            retry = false;
        } catch (InterruptedException e) {
        }
    }
}
于 2013-02-09T02:28:44.193 に答える
1

そこで、1行コメントして修正しました:

@Override
public void surfaceCreated(SurfaceHolder holder) {
    loading=false;
    if (!mThread.isAlive()){
        //mThread = new ViewThread(this);
        mThread.setMenuRunning(true);
        mThread.start();
    }
}

WeakReferenceこれは、および のSurfaceDestroyed回答とも組み合わされました。後でテストして、それがその1行の削除だけなのか、それとも弱い参照の組み合わせなのか、それ以外なのかを判断してから、答えを与えます

于 2013-02-10T06:26:31.227 に答える