標籤:
近來找了一些關於android線程間通訊的資料,整理學習了一下,並製作了一個簡單的例子。
andriod提供了 Handler 和 Looper 來滿足線程間的通訊。例如一個子線程從網路上下載了一副圖片,當它下載完成後會發送訊息給主線程,這個訊息是通過綁定在主線程的Handler來傳遞的。
在Android,這裡的線程分為有訊息迴圈的線程和沒有訊息迴圈的線程,有訊息迴圈的線程一般都會有一個Looper,這個事android的新 概念。我們的主線程(UI線程)就是一個訊息迴圈的線程。針對這種訊息迴圈的機制,我們引入一個新的機制Handle,我們有訊息迴圈,就要往訊息迴圈裡 面發送相應的訊息,自訂訊息一般都會有自己對應的處理,訊息的發送和清除,訊息的的處理,把這些都封裝在Handle裡面,注意Handle只是針對那 些有Looper的線程,不管是UI線程還是子線程,只要你有Looper,我就可以往你的訊息佇列裡面添加東西,並做相應的處理。 但是這裡還有一點,就是只要是關於UI相關的東西,就不能放在子線程中,因為子線程是不能操作UI的,只能進行資料、系統等其他非UI的操作。
在Android,這裡的線程分為有訊息迴圈的線程和沒有訊息迴圈的線程,有訊息迴圈的線程一般都會有一個Looper,這個是android的新概念。我們的主線程(UI線程)就是一個訊息迴圈的線程。針對這種訊息迴圈的機制,我們引入一個新的機制Handler,我們有訊息迴圈,就要往訊息迴圈裡面發送相應的訊息,自訂訊息一般都會有自己對應的處理,訊息的發送和清除,把這些都封裝在Handler裡面,注意Handler只是針對那 些有Looper的線程,不管是UI線程還是子線程,只要你有Looper,我就可以往你的訊息佇列裡面添加東西,並做相應的處理。
但是這裡還有一點,就是只要是關於UI相關的東西,就不能放在子線程中,因為子線程是不能操作UI的,只能進行資料、系統等其他非UI的操作。
一個Handler的建立它就會被綁定到這個線程的訊息佇列中,如果是在主線程建立的,那就不需要寫代碼來建立訊息佇列了,預設的訊息佇列會在主線程被建立。但是如果是在子線程的話,就必須在建立Handler之前先初始化線程的訊息佇列。如下面的代碼:
?
| 1234567891011121314151617181920212223242526272829 |
class ChildThread extends Thread { public void run() { /* * 建立 handler前先初始化Looper. */ Looper.prepare(); /* * 在子線程建立handler,所以會綁定到子線程的訊息佇列中 * */ mChildHandler = new Handler() { public void handleMessage(Message msg) { /* * Do some expensive operations there. */ } }; /* * 啟動該線程的訊息佇列 */ Looper.loop(); }} |
當Handler收到訊息後,就會運行handleMessage(…)的回呼函數,可以在裡面做一些耗時的操作。
最後完成了操作要結束子線程時,記得調用quit()來結束訊息迴圈隊列。
android線程間通訊