5

アクティビティの onPause が呼び出されても、SurfaceView が破棄されません。

のスレッドの世話をしています

public void surfaceCreated(SurfaceHolder holder) {
    if (mGameThread.getState() == Thread.State.TERMINATED) {
        createGameThread(getHolder(), getContext());
    }
    mGameThread.setRunning(true);
    mGameThread.start();
}


public void surfaceDestroyed(SurfaceHolder holder) {
    boolean retry = true;
    mGameThread.setRunning(false);
    while (retry) {
        try {
            mGameThread.join();
            retry = false;
        } catch (InterruptedException e) {
        }
    }
}

ハックとして、onResume でスレッドの状態を確認する必要があり、スレッドが既に終了している場合は、アクティビティを終了します

protected void onResume() {
    Log.d(mLogTag, "onResume()");
    super.onResume();
    if (mGameThread != null) {
        if (mGameThread.getState() == Thread.State.TERMINATED) {
            finish();
        }
    }

}

残念ながら、スレッド処理を surfaceDestroyed および surfaceCreated からアクティビティの onPause() および onResume() に移動することはできません。onPause() で SurfaceView を手動で破棄し、onResume() で再作成することは可能ですか?

4

3 に答える 3

3

レイアウトを surfaceview の親として追加し、onPause() でレイアウト GONE の可視性を設定し、アクティビティの onResume() で VISIBLE を設定できます。

于 2015-03-03T13:01:17.483 に答える