2013-06-13 49 views
1

我想知道TimerTask是如何與線程一起工作的。Android上的TimerTask如何管理線程?

例如,我有一個執行TimerTask的代碼,它有一個將在UI線程上運行的'run'方法。

class looper extends TimerTask { 

    public looper() { 

    } 

    public void run() { 
     runOnUiThread(new Runnable() { 
      @Override 
      public void run() { 
       timer.schedule(new looper(), new Date(new Date().getTime() + 100)); 
      } 
     }); 
    } 
} 

和計時器應該像這樣開頭:

timer = new Timer(); 
    timer.schedule(new looper(), new Date()); 

將一個TimerTask創建一個新的線程?如果是這樣,runOnUiThread將如何工作?它會移動代碼到UI線程嗎?我試圖消除需要再次調用TimerTask(timer.schedule),只是使用run內的無限循環進行計算 - 但這會阻止UI線程和應用程序不會響應。

P.S - 我必須讓代碼在UI線程上運行,因爲它必須更新UI。

那麼,這是怎麼回事?

回答

2

關於你的問題:

  • runOnUiThread從文檔:

    運行在UI線程上指定的動作。如果當前線程是UI線程,那麼該動作立即執行。如果當前線程不是UI線程,則該操作將被髮布到UI線程的事件隊列中。

  • TimerTask中的代碼在不同的線程上執行,因此您應該調用runOnUiThread來執行代碼。

你做得對,但你爲什麼在run方法中重新創建timertask?考慮使用scheduleAtFixedTime,這100將是期間和延遲0. 運行方法然後將執行它應該做的任務。

runOnUiThread(new Runnable() { 
     @Override 
     public void run() { 
      //do whatever 
     } 
    }); 

scheduleAtFixedTime

*更新:

如果其更新到視圖它是更好地使用handler.postDelayed,看到一個example here它將在UI線程上的延遲之後執行。

+0

我沒有發佈完整的代碼,但我需要控制下一個時間任務的運行時間 - 這就是爲什麼我再次設置計時器的原因。 – Roman

+0

有沒有辦法避免在新線程和UI線程之間進行上下文切換? – Roman

+0

我已經更新了答案。 – AlexBcn