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);
}
}
}
코드의 'surfaceHolder' 객체에 다른 동기화가 있습니까? 어쨌든'lockCanvas'와'unlockCanvasAndPost' 사이가 아니라'unlockCanvasAndPost' 다음에'Thread.sleep'을 호출해야합니다. –
오, 안돼! 당신은 구세주입니다! 'unlockCanvasAndPost' 다음에'Thread.sleep'을 넣을 때, 문제는 다시 발생하지 않습니다. 이제 루프의 시작에서 잠을 자지 않아도됩니다. 답으로 게시 해주세요, 받아 들일 것입니다! – neevek