2013-10-09 1 views
-1

캔버스에 Android 페인팅에 스레드가 있습니다. 그것은 모두 잘 작동하지만, 스레드가 아직 그 시간에 이미있는 캔버스에 그리기를 시도하기 때문에 내가 다시 버튼을 누르면 응용 프로그램이 충돌합니다. 코드에서 더 이상 코드 조각에 도달해서는 안됩니다. 내 표면이 파괴됩니다 뒷면 버튼을 누르면에Android : 스레드가 너무 오래 실행되어 중지 된 후에도 의미가 있음

: 나는 false로 thread.setRunning 위에서 보시다시피 그래서

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

을 내 스레드는이

public void run() 
    { 
     while (run) 
     { 
      Canvas c = null; 
      try 
      { 
       c = sh.lockCanvas(null); 
       synchronized (sh) 
       { 
        doDraw(c); 
       } 
      } 
      finally 
      { 
       if (c != null) 
       { 
        sh.unlockCanvasAndPost(c); 
       } 
      } 
    } 
    } 

while 루프는해야하지 이 var를 false로 설정하자마자 멈추지 만 여전히 doDraw() 메소드에 들어갑니다. 왜 doDraw (여기에 내 널 포인터 excepetion 얻을) 여전히 호출되고 이해가 안 돼요. 어떤 아이디어?

답변

0

나는 안드로이드 전문가가 아니라 초보자이지만, 동기화 된 블록을 확장하는 것은 어떨까요 (값을 읽고 값을 하나의 원자 연산으로 사용해야 함), 예.

  synchronized (sh) 
      { 
       c = sh.lockCanvas(null);     
       doDraw(c); 
      } 

또한 onStop에서 addintional 스레드를 중지하거나 파괴 할 수 있습니까?

마침내 블록에 대해 궁금합니다. 아마도 그것도 동기화해야합니까? 확실하지 않습니다 ...

0

나는 당신을 위해 일할 수 있는지 모르겠지만 IntentService에서 동일한 작업을 시도 할 수 있습니다.

활동이 완료되는 동안 IntentService가 중지되었으므로 문제가 해결 될 수 있습니다. doDraw 메서드를 그리기 위해 핸들러를 사용한다고 가정 해 봅시다. 제가 틀 렸습니다. 제발, 당신의 생각과 결과를 알려주세요.

+0

IntentService도 작동 할 수 있습니다. 왜 모든 튜토리얼이 캔버스에서 그리는 지, intnetService가 아닌 스레드를 사용하는지 알 수 없습니다. 누구든지 이유를 알고 있습니까? – AndyAndroid

+0

이유를 모릅니다. 아마 대부분의 사람들이 Java에서했던 것처럼 같은 방식으로 작업하는 습관 때문일 것입니다. IntentService를 사용하여 작동하는지 확인하고 작동하는지 확인하십시오. –

+0

@AndyAndroid 어떻게 마침내 해결 했습니까? –

0

Thread#join 스레드를 죽이지 않고 그냥 죽을 때까지 기다립니다. 스레드의 루프를 run=false으로 설정하거나 stop 또는 interrupt과 같은 메서드를 사용하여 루프를 종료해야합니다. 그들은 더 이상 사용되지 않으며 기본적으로 사용되어서는 안됩니다.

+0

surfaceDestroyed의 시작 부분에서 실행이 false로 설정됩니다. – AndyAndroid

관련 문제