2011年10月27日 星期四

Android Thread 入門

許久沒貼文章了,本篇主要是以Android Thread 入門為主。

Android Thread使用時機:
當Android執行程式超過一段時間後,系統發出ANR並強制關閉程式;
ANR -- “Application Not Responding”,發生於下列兩項之一:
1.主要執行緒 (“事件處理執行緒” / “UI執行緒”) 在5秒內沒有回應輸入事件。
2.BroadcastReceiver 沒有在10秒內完成返回。
下圖是常見的ANR告警畫面:



由上述理由,負載大的處理不要在 onCreate()中進行。
解決方式:
1.Thread
2.Services

下圖資料出自於Google年度大會簡報中 Writing Zippy Android Apps.PDF


既然這篇以Thread為主,因此也應該了解一下Thread Life Cycle,下圖是Thread Life Cycle:


Java自訂執行緒的方式有三種:
繼承 Thread類別
實作Runnable介面
使用Timer及TimerTask方式

上述三種方式由於Thread執行結果遇到需要傳回值Android使用者介面(UI)時,會造成Thread強制中斷產生Exception。
解決方式是使用Handler物件

下面使用了Android SDK開發範例大全中的範例進行說明:



執行結果如下圖所示:


另外除上述參考外,在進階學習部分建議先把Handler, Message, Looper, MessageQueue弄清楚,
上述四個 class 只有一個共同的目標就是讓程式碼,可以丟到其它 thread 去執行。

Handler
在於提供 callback function,給其它 Thread 作執行 但Handler又要如何 transfer 至其它 Thread 呢 ?  於是有了 Message

Message
將 Handler 包裝起來,傳送給其它 Thread但是同時有多條 thread 不斷的在系統中傳遞 Message 那麼如何緩衝呢 ?

MessageQueue
是為了讓 Message 能夠作緩衝,好讓Message先暫存起來。因此,當Message 已經被放在其它 Thread上的MessageQueue 之後,它裡面包著 Handler,而 Handler上的 callback function 總得有人來執行吧 ??

Looper
就是為了將 Message 由 Thread 所對應的 MessageQueue 取出來,並且拿出 Handler來執行它上面的 callback function.

參考:
執行緒的生命週期 
http://eoffice.im.fju.edu.tw/phpbb/viewtopic.php?p=29466&highlight=#29466

Writing Zippy Android Apps
http://www.android-app-developer.co.uk/android-app-development-docs/android-writing-zippy-android-apps.pdf

多執行緒-Handler和Thread的關係
http://j796160836.pixnet.net/blog/post/28766165-%5Bandroid%5D-%E5%A4%9A%E5%9F%B7%E8%A1%8C%E7%B7%92-handler%E5%92%8Cthread%E7%9A%84%E9%97%9C%E4%BF%82

清楚了解 android.os 源碼中的Looper,Handler,Message,MessageQueue
http://milochen.wordpress.com/2011/03/25/understanding-android-os-src-looperhandler-message-messagequeue/

沒有留言:

張貼留言