6

私は現在、Lunar Lander のサンプルをいじって、Android に慣れてきています。

アプリから離れて移動すると (呼び出しボタンを押すなど)、下にあるサーフェスが破壊されることがわかりました (呼び出しsurfaceDestroyed)。

戻る (これにより がトリガーさonWindowVisibilityChangedれます) と、再作成せずにサーフェスに描画しようとするため、アプリがクラッシュします。

onWindowVisibilityChangedSurfaceView の基盤となるサーフェスを再生成し、適切に実行を再開する (または他の場所に)配置できるコードはありますか?

これは単純な関数呼び出しであるように感じますが、API ドキュメントには何も見つかりません。

ありがとう!

4

2 に答える 2

2

「mSurfaceExists = true」のこのソリューションも機能しません。super.onWindowVisibilityChanged() が呼び出されていないため、surfaceCreated() が呼び出されていないようです。したがって、threas.start が呼び出されないため、サーフェスは作成されず、クラッシュしません。

問題は次のとおりだと思います。スレッドが既に開始されているため、thread.start() を呼び出すとエラーが発生します。しかし、surfaceDestroyed() では、thread.join によってスレッドが完了して終了します。また、スレッドは一度停止すると再開できません。

トリックは、surfacecreated で新しいスレッドを作成するか、ユーザーがアプリケーションを呼び出して終了 (バック キー) し、一時停止 (ホーム キー) しない場合にのみスレッドを完了することだと推測しています。これは、アクティビティで isFinishing() を呼び出すことで確認できます。

これが機能するかどうかはわかりません。私はこれをすぐに試します。

于 2010-11-04T20:28:54.460 に答える
1

誤診!アプリはサーフェスを自動的に再作成しますが、作成される前にサーフェスに描画しようとする呼び出しがあります。

問題の修正:

boolean mSurfaceExists;
...
public void surfaceDestroyed(SurfaceHolder holder) {
    mSurfaceExists = false;
    ...
}

public void surfaceCreated(SurfaceHolder holder) {
    mSurfaceExists = true;
    ...
}

protected void onWindowVisibilityChanged(int visibility) {
    // only call base if there's a surface
    if(mSurfaceExists)
        super.onWindowVisibilityChanged(visibility);
}

今、それはすべてうねりです。(私が知る限り、とにかく-Java / Androidの専門家は、これが悪い習慣である場合はコメントしてください!)

于 2009-03-23T06:45:22.380 に答える