2014-05-23 29 views
1

我想使用下面的代碼在我的android遊戲中實現一個計時器。此代碼在每秒之後運行某些代碼。通過處理程序的無限循環會阻塞UI線程嗎?

final Handler handler = new Handler(); 
    Runnable runable = new Runnable() { 

     @Override 
     public void run() { 
      try{ 
       //task to be done 
       handler.postDelayed(this, 1000); 
      } 
      catch (Exception e) { 
       // TODO: handle exception 
      } 
      finally{ 
       //task to be done 
       handler.postDelayed(this, 1000); 
      } 
     } 
    }; 
    handler.postDelayed(runable, 1000); 

該處理程序是在UI線程中創建的。這樣的無限循環會阻塞線程嗎?如果不是爲什麼不呢?

+1

它會阻止線程運行「任務完成」所需的時間...然後約1秒線程將免費爲其他東西... – Selvin

回答

1

沒有循環和控制返回到處理消息隊列的UI線程循環。它不會阻塞UI線程。

但是,您正以其他方式佔據UI線程。每次調用runnable都會重新發布自己兩次:一次在try,第二次在finally中,因此有效地使消息隊列中事件的數量每秒增加一倍。最終,UI線程將無法做任何有用的工作來處理其他事件。

+0

所以如何解決此轉貼? – user3293494

+1

在可運行狀態中調用'postDelayed()'只有一次而不是兩次。 – laalto

+1

僅在終於使用postDelayed – Selvin