- Sleep / Delay 的功能
- UI 卡住不能更新
Android 不能套用 Java or C 的 sleep 方法,列出幾種可以取代的方法
以下幾個方法都可以達到 "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
參考 URL:
參考 URL:
- http://www.cnblogs.com/playing/archive/2011/03/24/1993583.html
- http://ascii-iicsa.blogspot.com/2010/10/androidtimer.html
- http://www.limodev.cn/blog/archives/1207
- http://www.360doc.com/content/10/1216/10/1605498_78592393.shtml
- http://sonyericssonss.blog.163.com/blog/static/10968396920104561215503/
- http://www.cnblogs.com/crazypebble/archive/2011/03/23/1991829.html
- http://caterpillar.onlyfun.net/Gossip/JavaGossip-V2/TimerTaskAndTimer.htm
- http://developer.android.com/resources/articles/painless-threading.html
- http://www.android1.net/Topic.aspx?BoardID=11&TopicID=651
- http://ccanywhere.pixnet.net/blog/post/25520924
- http://www.android123.com.cn/androidkaifa/422.html
- http://jacky-google-android.blogspot.com/2010/07/thread.html
>>定期工作 & UI 更新 & Message dispatcher (與呼叫者處於同一線程; 可用 Message 與 Other thread 溝通)
回覆刪除其實只要在同一個 process 就可以了,只要你拿得到該 Handler 的 instance,不一定要在同一個 thread。
^^
Handler 很好用...但假設是綁在 main thread (UI thread) 的 Handler,就要小心不要在裡面寫到佔時間的東西,比如 Sleep 這類的 code ..它還是會造成你的 AP 無回應的..
感覺 Android 提供多種方法去 update UI,可是還是有不同情況下的差別,有時候為了找對方法,要花點時間。不過大部分都可以用 Handler 來解決...
回覆刪除