2012-11-20 180 views
2

我正在嘗試使用Android相機拍照。當程序第一次啓動時,我需要等待1秒左右,以便預覽可以啓動並且可以拍攝照片。我用Handler.postDelayed做到了這一點,它工作正常。Handler.postDelayed永久等待執行

現在,我想暫停程序的流程,直到run()被執行,其中我用了一個帶有標誌的while(true)循環來表示該方法已完成。但是,程序凍結。沒有錯誤返回。任何人都可以灑一些燈?下面是我的代碼

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或使用互斥(對象通知/等待) –

回答

0

取出while(true)並應繼續,讓我解釋一下:

Android有任務隊列,所以當共完成當前任務,將進入下一個任務,所以在你的情況PostDelayed將在它完成當前的Infinity loop之後執行,因爲循環阻塞了隊列中的Runnable,所以永遠不會完成。

所以最好的方法是刪除Infinity loop,並在runnable調用結束時繼續流或偵聽器。

+0

你確定嗎?我認爲他想繼續循環直到標誌成立。問題可能是標誌的值被緩存爲false,並且它需要變化。 – corsiKa

+0

是的,我試圖記錄標誌的值,它總是假的,這意味着run()永遠不會被執行。 – akka243

+0

從不使用阻塞方式(就像你做的那樣),你必須使用監聽器的回調函數。 –