2012-03-05 12 views
1

Android 4.0で標準のゲームスレッドでいくつかのゲームをテストすると、アクティビティがシャットダウン(ホームボタンなど)され、nullPointer 。アクティビティを終了するときにAndroid 4.0でスレッドクラッシュが発生する

これは、GoogleがプログラムしたLunarLanderサンプルでも発生します。

問題は、アクティビティから出るときにCanvasがnullになり、アプリケーションがクラッシュするという問題です。

LogCatのエラーメッセージは以下のとおりです。

02-27 18:07:58.974: V/MainThread(2667): CANVAS [email protected] 
02-27 18:07:59.164: V/MainThread(2667): CANVAS null 
02-27 18:07:59.164: W/dalvikvm(2667): threadid=14: thread exiting with uncaught exception (group=0x409c01f8) 
02-27 18:07:59.174: E/AndroidRuntime(2667): FATAL EXCEPTION: Thread-108 
02-27 18:07:59.174: E/AndroidRuntime(2667): java.lang.NullPointerException 
02-27 18:07:59.174: E/AndroidRuntime(2667):  at com.joakimengstrom.pong.MainThread.run(MainThread.java:49) 

上記のLog.vを使用してスレッドを開始するときのコードです。

以下は、スレッドを作成し、サーフェスが破棄されたときにスレッドをシャットダウンするときです。

@Override 
public void surfaceCreated(SurfaceHolder holder) { 
    thread = new MainThread(getHolder()); 
    thread.setRunning(true); 
    thread.start(); 
} 

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

     } 
    } 
} 

キャンバスをヌルにすることなく安全な方法でスレッドを終了させるにはどうすればよいですか?

答えて

8

Android 4.0では、SurfaceHolder.lockCanvasは、表面が破壊されたときにnullを返すことができます。だからここに:

try {    
      canvas = this.surfaceHolder.lockCanvas(null); 
      synchronized (surfaceHolder) { 
       Log.v(TAG, "CANVAS " + canvas); 
       canvas.drawColor(Color.BLACK); 

だけif (canvas != null)であなたのsynchronized (surfaceHolder)ブロックを囲みます。これにより、描画が不要なときにアプリケーションの動作に問題が発生してはなりません。

+0

Android 4.0 SurfaceHolder.lockCanvasがnullを返すように変更されたことをどのように知っていますか?私はそれがAndroid Developersサイトのどこにでも書かれているとは思わない。 –

+0

ここでもまったく同じ問題ですが、「Android 4.0では、SurfaceHolder.lockCanvasはnullを返すことができますか? – Lenciel

+0

同じ問題に取り組む個人的な経験から。 –

関連する問題