2009-03-23 3 views
5

私は現在、Lunar Landerサンプルを使って遊んでいて、Androidで把握しています。Android:SurfaceViewを使用してフォーカスを取り戻す

私は、アプリから離れて(例えば、コールボタンを押して)移動すると、基底のサーフェス(surfaceDestroyed)が破壊されることがわかりました。

戻ってくると(これはonWindowVisibilityChangedをトリガーします)、アプリケーションは再作成せずにサーフェスに描画しようとするため、クラッシュします。

onWindowVisibilityChanged(または他の場所)に置くことができるコードがありますか?SurfaceViewの基礎となるサーフェスを再生成し、実行をうまく再開しますか?

これは単純な関数呼び出しでなければならないと感じますが、APIドキュメントでは何も見つかりません。

ありがとうございます!

答えて

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の専門家は、これが悪い習慣であれば自由にコメントすることができます)

+0

これを試してみましたが、月面着陸ゲームを正しく描いていません。あなたが得るのは、宇宙船や背景ではなくテキストです。 –

2

"mSurfaceExists = true"のこの解決策は私にとってはうまくいきません。 super.onWindowVisibilityChanged()が呼び出されていないため、surfaceCreated()が呼び出されていないようです。したがって、サーフェスは作成されず、threas.startが呼び出されないためクラッシュしません。

私はこの問題が次のように考えています: スレッドが既に開始されているため、thread.start()を呼び出すとエラーが発生します。 しかし、surfaceDestroyed()では、thread.joinによってスレッドが完了して終了します。かつてスレッドを再始動することはできません。

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

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

+0

ちょうどテスト(デバッグ)されています。 'surfaceDestroyed()'は、Appが隠されてスレッドが停止するとすぐに呼び出されます。アプリケーションを再び表示すると、 'surfaceCreated()'が呼び出され、スレッドを再び開始しようとします。その結果、IllegalThreadStateExceptionが発生します。 – Ridcully

関連する問題