2012-10-12 2 views
2

SurfaceView를 사용하여 선택 윤곽 피쳐를 만들지 만, SurfaceView의 드로잉 스레드가 실행되고 UI 스레드가 차단되거나 BACK 또는 MENU 버튼에 대한 터치가 전달되지 않고 ANR이 생성되는 경우가 있습니다. 이것은 지금 일어난다.언제 SurfaceView에서 드로잉을 시작해야합니까?

나는 서피스 뷰 SurfaceView에서 도면 뭔가가 완전히 초기화 후 너무 일찍 (물론 나는 그림이 surfaceCreated()surfaceDestroyed() 사이에 발생 확인), 내가 추측 도면 스레드가 시작, 어쩌면 뭔가 관련이 있어야 시작하기 때문에이 추측 활동?

실제로 드로잉을 시작 SurfaceHolder.lockCanvas()에 의해 반환 Canvas를 사용하는 코드, 거의 여전히 발생, 사라 문제 이전에 Thread.sleep(100)을 추가 할 수 있지만 주파수가 낮 으면. 드로잉 스레드를 캔버스에 실제로 드로잉하기 전에 충분히 오래 자면 문제가 다시 발생하지 않습니다.

무언가이 완전히 초기화되었지만 그 무엇이 무엇인지에 대해 알지 못하는 것 같습니다.

이 SurfaceView는 레이아웃 파일에있는 일반 뷰로 사용되며 다음은 표면에 그리는 데 사용되는 코드입니다.

public void run() { 
    try { 
     // this is extremely crucial, without this line, surfaceView.lockCanvas() may 
     // produce ANR from now and then. Looks like the reason is that we can not start 
     // drawing on the surface too early 
     Thread.sleep(100); 
    } catch (Exception e) {} 

    while (running) { 
     Canvas canvas = null; 
     try{ 

      long ts = System.currentTimeMillis(); 

      canvas = surfaceHolder.lockCanvas(); 
      if (canvas != null) { 
       synchronized (surfaceHolder) { 
        doDraw(canvas); 
       } 

       ts = System.currentTimeMillis() - ts; 
       if (ts < delayInterval) { 
        Thread.sleep(delayInterval - ts); 
       } 
      } 

     } catch (InterruptedException e) { 
      // do nothing 
     } finally { 
      if (canvas != null) 
       surfaceHolder.unlockCanvasAndPost(canvas); 
     } 

    } 
} 
+0

코드의 'surfaceHolder' 객체에 다른 동기화가 있습니까? 어쨌든'lockCanvas'와'unlockCanvasAndPost' 사이가 아니라'unlockCanvasAndPost' 다음에'Thread.sleep'을 호출해야합니다. –

+0

오, 안돼! 당신은 구세주입니다! 'unlockCanvasAndPost' 다음에'Thread.sleep'을 넣을 때, 문제는 다시 발생하지 않습니다. 이제 루프의 시작에서 잠을 자지 않아도됩니다. 답으로 게시 해주세요, 받아 들일 것입니다! – neevek

답변

1

당신은 SurfaceHolder.lockCanvasSurfaceHolder.unlockCanvasAndPost 사이 Thread.sleep를 호출하지 않아야합니다, 캔버스 잠금이 해제 된 후에 만 ​​호출해야합니다.

코드 예제에서 캔버스는 거의 항상 잠겨있어 starvation이됩니다. SurfaceFlinger가 캔버스에 처리 할 작은 창이 있습니다. 때로는이 코드가 실패 할 수 있으므로 ANR 오류가 산발적으로 발생하는 것입니다.

+0

우수! 두 번째 단락은 문제를 명확하게 설명합니다! 고맙습니다! – neevek

관련 문제