2012-03-05 198 views
1

當測試的幾款遊戲在Android 4.0的標準遊戲線程它工作得很好,直到活動被關閉(按home鍵等),使活動與一個空指針的應用程序崩潰。線程崩潰

這甚至發生在樣品LunarLander,谷歌編程。

的問題是,帆布離開活動,使應用程序崩潰時變爲零。

從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如上所示。

while(this.running){ 
     canvas = null; 

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

而下面是當創建線程和關閉它時,表面被破壞。

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

只是環繞你synchronized (surfaceHolder)塊與if (canvas != null)。這不會導致您的應用程序的行爲發生任何問題,因爲它在不需要繪圖時發生。

+0

你是怎麼知道在Android 4.0中SurfaceHolder.lockCanvas被更改以便返回null的?我沒有看到它記錄在Android開發者網站上的任何地方。 – 2012-03-21 19:07:42

+0

完全相同的問題在這裏,也想知道你是如何發現「在Android 4.0中,SurfaceHolder.lockCanvas可以返回null?」 – Lenciel 2012-12-10 06:24:19

+0

從解決同樣問題的個人經驗。 – 2012-12-10 14:01:09