搜尋此網誌

2011年4月1日

Android timer / sleep / delay / 更新 UI 的方法

目的:
  1. Sleep / Delay 的功能
  2. UI 卡住不能更新

Android 不能套用 Java or C 的 sleep 方法,列出幾種可以取代的方法
以下幾個方法都可以達到 "Delay" 的效果 (A1 -> (wait 10s) -> A2 -> (wait 10s) -> A3...)

  1. Thread + sleep (Thread.sleep(xxx))
  2. Handler (handler.postDelayed(Runnable, 2000);) => Call back 到 Runnable 的 run()
  3. Timer (timer.schedule(TimerTask, 10000);) => Call back 到 TimerTask 的 run()
  4. Thread + Handler
  5. Timer + Handler
  6. SystemClock.sleep(2000);
  7. asynctask
  8. Handlerthread
  9. IntentService

若要更新 UI,可以在 UI/Main thread 或者 other thread:
  1. Thread + Handler
  2. Timer + Handler
  3. Timer: postInvalidate (update a view when you're not in the current UI thread.) => http://blog.csdn.net/lixinso/archive/2009/06/23/4290432.aspx
  4. Activity.runOnUiThread(Runnable) => http://lak4cyut.blogspot.com/2011/03/android-tip-activityrunonuithread.html
  5. View.post(Runnable)
  6. View.postDelayed(Runnable, long)
Handler / Timer 簡單的應用區分:

Handler / Timer 使用的時機:
  1. 當 Delay or Sleep 用
  2. 類似迴圈的應用
  3. 定期觸發的定期行為
只要講到 Timer or Handler,一定會跟幾個名詞綁在一起: Thread / Handler / Timer / Timertask / Message / Looper / AsyncTask

參考 URL:

2 則留言:

  1. >>定期工作 & UI 更新 & Message dispatcher (與呼叫者處於同一線程; 可用 Message 與 Other thread 溝通)

    其實只要在同一個 process 就可以了,只要你拿得到該 Handler 的 instance,不一定要在同一個 thread。

    ^^
    Handler 很好用...但假設是綁在 main thread (UI thread) 的 Handler,就要小心不要在裡面寫到佔時間的東西,比如 Sleep 這類的 code ..它還是會造成你的 AP 無回應的..

    回覆刪除
  2. 感覺 Android 提供多種方法去 update UI,可是還是有不同情況下的差別,有時候為了找對方法,要花點時間。不過大部分都可以用 Handler 來解決...

    回覆刪除