2012-11-20 5 views
2

Android 카메라로 사진을 찍으려고합니다. 미리보기를 시작하고 사진을 찍을 수 있도록 프로그램을 시작할 때 1 초 정도 기다려야합니다. 나는 그것을 Handler와 함께했다 .postDelayed 그리고 그것은 잘 동작한다.Handler.postDelayed를 실행하기 위해 영원히 기다리는 중

지금, 내 문제는 run()이 실행될 때까지 프로그램의 흐름을 일시 중지하고 싶습니다. 메서드가 완료되었음을 알리는 플래그가있는 while (true) 루프를 사용했습니다. 그러나 프로그램이 멈 춥니 다. 오류가 반환되지 않습니다. 누군가는 약간의 불을 흘릴 수 있습니까? 그 다음 작업으로 이동합니다 현재 작업을 finishs 경우에, 그래서, 그래서,

안드로이드 작업 큐를 가지고 아래 설명해 드리죠,

flag = false; 
handler.postDelayed(new Runnable() { 
      public void run() 
      { 
       preview.camera.takePicture(shutterCallback, rawCallback, jpegCallback); 
       preview.camera.startPreview(); 
       flag = true; 
      } 
     }, 1000); 

     while (true) 
     { 
      if (flag) break; 
     } 
+1

Runnable을 변수로 저장 한 다음 handler.removeCallbacks (실행 가능한 변수)를 호출하면 실행을 취소해야 할 때 –

+0

응답을 주셔서 감사합니다.하지만 내 질문을 오해 한 것 같습니다. 처리기가 1 초 후에 종료되도록하고 run()이 작업을 마칠 때까지 코드의 흐름을 유지하려고합니다. – akka243

+0

그럼 핸들러가 필요 없어요. Thread.sleep을 호출하거나 mutex (Object notify/wait)를 사용하십시오. –

답변

0

while(true)를 제거하고 계속해야 내 코드입니다 루프가 Runnable을 대기열에서 차단하고 있기 때문에 귀하의 케이스 PostDelayed은 현재 Infinity loop을 완료 한 후에 실행됩니다.

따라서 가장 좋은 방법은 Infinity loop을 제거하고 실행 가능한 호출의 끝에서 흐름 또는 수신기를 계속하는 메소드를 호출하는 것입니다.

+0

정말입니까? 나는 그가 깃발이 참일 때까지 계속 반복하고 싶다고 생각한다. 문제는 플래그의 값이 false로 캐시되고 휘발성이어야한다는 것입니다. – corsiKa

+0

예, 플래그의 값을 로그하려했으나 항상 false입니다. 즉, run()이 실행되지 않습니다. – akka243

+0

결코 차단 방법을 사용하지 마십시오. 리스너를 사용하여 콜백을 사용해야합니다. –

관련 문제