Fork me on GitHub

6/14/2011

[Android] Thread, Looper, Handler and MessageQueue

目標:

Handler, Message, MessageQueue, Looper 它們四個 class 只有一個共同的目標
就是讓程式碼,可以丟到其它 thread 去執行。這麼作有什麼好處呢 ??

Android 的 GUI 元件不是 thread safe的 (屬單線程模型,Android UI 操作並不是線程安全的,並且這些操作必須在 UI線程 中執行,無法 multi-thread 執行)。

Activity 的畫面顯示是由 UI Thread 所負責的,若是你寫了 mutlti-thread 程式,又想更新畫面,就必須要將 Thread 內部的一段程式碼,交由 UI 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.

當 Looper.java 中的 loop() 被呼叫起來之後,它就是在反覆作這件事
不斷將 Handler 由 Message 取出來,並且執行 Handler 上的 callback function。


Attribute to - [Android 개발] Looper와 Handler

這裡可以參考兩個網路文章的範例:

1. Detecting Network Speed and Type on Android (Edge,3G) | Greg's Dev Blog

  • 這個範例當中展示了,override Handler 物件 (此 handler 綁定 UI thread) 當中的 handleMessage 方法,對 MessageQueue 當中不同的 message 作處理 (利用 switch case 判斷message 更新 UI)。
  • 宣告了一個 Runnable 物件,並在 button 按下去的時候開啟一個新的 thread (以該 Runnable 物件初始化該 thread) 執行下載的任務,注意,在下載任務執行的代碼中,利用 mHandler.sendMessage() 將 message 傳入 UI thread 的 MessageQueue 當中進行 UI 更新。

2. Android Guts: Intro to Loopers and Handlers | Mind The Robot

  • 不同上面的範例,此範例將 Download 寫成一個獨立的 class (DownloadThread.java) 繼承 Thread,並且覆寫 run 函式,在其中實現 Looper 機制,負責處理 MessageQueue 中的任務 (範例中只是用一個計時器模擬下載任務)。
  • 而 DownloadQueueActivity 這個主要的 UI thread 包含一個 DownloadThread 成員,並且實現了 DownloadThreadListener 介面。在建構式中,將自己指定為 DownloadThread 成員的 Listener。由此,DownloadThread 可以調用 handleDownloadThreadUpdate 這個介面函式,讓 UI thread 做更新。反向來看,點擊 DownloadQueueActivity 當中的按鈕,則可以向 DownloadThread 的 MessageQueue 添加任務 (利用 enqueueDownload 函式)。

若想要更進一步瞭解細節可以依序參考下面的資料!


參考資料:

清楚瞭解 android.os 源碼中的 Looper,Handler,Message,MessageQueue | Milochen's Blog for hacking
http://milochen.wordpress.com/2011/03/25/understanding-android-os-src-looperhandler-message-messagequeue/

Android Guts: Intro to Loopers and Handlers | Mind The Robot
http://mindtherobot.com/blog/159/android-guts-intro-to-loopers-and-handlers/

Handler, Looper, Thread | Eddy@Joomla!藏經閣
http://blog.joomla.org.tw/android/173-Handler-Looper-Thread.html

Android 講義摘錄 | Google Android 論壇
http://www.android1.net/Topic.aspx?BoardID=11&TopicID=294

Android的線程使用來更新UI - Thread、Handler、Looper、TimerTask 等 | 山嶺巨人
http://www.cnblogs.com/playing/archive/2011/03/24/1993583.html

Android – Thread Messaging | DK's Blog
http://codinghard.wordpress.com/2009/05/16/android-thread-messaging/



... ...

No comments:

Post a Comment