以下幾個方法都可以達到 "Delay" 的效果 (A1 -> (wait 10s) -> A2 -> (wait 10s) -> A3...)
- Thread + sleep (Thread.sleep(xxx))
- Handler (handler.postDelayed(Runnable, 2000);) => Call back 到 Runnable 的 run()
- Timer (timer.schedule(TimerTask, 10000);) => Call back 到 TimerTask 的 run()
- Thread + Handler
- Timer + Handler
- SystemClock.sleep(2000);
- asynctask
- Handlerthread
- IntentService
若要更新 UI,可以在 UI/Main thread 或者 other thread:
- Thread + Handler
- Timer + Handler
- 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
- Activity.runOnUiThread(Runnable) => http://lak4cyut.blogspot.com/2011/03/android-tip-activityrunonuithread.html
- View.post(Runnable)
- View.postDelayed(Runnable, long)
Handler / Timer 簡單的應用區分:
- Handler:
- 定期工作 & UI 更新 & Message dispatcher (與呼叫者處於同一線程; 可用 Message 與 Other thread 溝通)
- 對運行在不同線程中的多個任務進行排隊,並使用Message和Runnable對象安排這些任務。
- HandlerThread:
- 由於採用Android Handler的post()方法並不能真正創建新的線程(參照博文:Handler.post()說明),此處引入HandlerThread和Looper來創建新的線程。
- HandlerThread繼承自Java的Thread類,HandlerThread用來創建持有一個Looper對象的線程,此Looper對象可以用來創建Handler對象。通過這種方式創建的Handler對象其start()方法一定會被調用。
- Looper 直接繼承自Java的Object類,用來為一個線程維護一個消息循環隊列。線程自身默認是沒有消息隊列與其相關的;為了給線程創建消息循環隊列,要調用Looper的prepare()方法和loop()方法來創建及運行一個消息隊列。
- 參考:
- http://www.zeroup.org/looper-by-handlerthread-and-create-a-new-thread.html
- http://ytfei.iteye.com/blog/717227
- http://water-e.blogspot.com/2009/04/android_23.html
- http://oommoo.wordpress.com/2009/12/02/handler-%E8%88%87-handlerthread-%E5%8E%9F%E7%90%86/
- http://blog.csdn.net/fenghome/archive/2010/06/17/5675421.aspx
- Timer: 定期工作
Handler / Timer 使用的時機:
- 當 Delay or Sleep 用
- 類似迴圈的應用
- 定期觸發的定期行為
只要講到 Timer or Handler,一定會跟幾個名詞綁在一起: Thread / Handler / Timer / Timertask / Message / Looper / AsyncTask
沒有留言:
張貼留言