2012-03-05 5 views
1

Android 4.0에서 표준 게임 스레드로 여러 게임을 테스트 할 때 Activity가 종료 될 때까지 작동합니다 (홈 버튼 등). 응용 프로그램이 nullPointer .활동을 종료 할 때 Android 4.0에서 스레드 크래시가 발생합니다.

Google이 프로그래밍 한 샘플 LunarLander에서도 이러한 현상이 발생합니다.

문제는 캔버스가 활동을 떠날 때 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와 함께 스레드를 시작할 때의 코드입니다.

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) { 

     } 
    } 
} 

캔버스가 null이 아닌 안전한 방법으로 스레드를 종료하려면 어떻게해야합니까?

답변

8

안드로이드 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

동일한 문제를 해결하기 위해 개인적인 경험을 쌓았습니다. –

관련 문제