1. 程式人生 > >Android的多執行緒——Handler和Async Task學習筆記

Android的多執行緒——Handler和Async Task學習筆記

首先是郭神的話:“和許多其他的GUI庫一樣,android的UI也是執行緒不安全的。也就是說,如果想要更新應用程式裡的UI,則必須在主執行緒中進行,否則就會出現異常。對於這種情況,安卓提供了一套非同步訊息處理機制,完美地解決了在子執行緒中進行UI操作的問題”。

具體就是兩種方式:

Handler和AsyncTask這兩個類。

Handler的程式碼直接寫在gitHub裡面了,為什麼我覺得Handler要比AsyncTask簡單不少?

Looper容器暫時不管了。。

1.Handler

Handler放在UI執行緒裡,作為一個內部類,裡面準備一個handleMessage方法,進行UI更新操作,而發出UI更新操作的請求來自新的執行緒,該執行緒新生成一個Messasge物件,Message物件可以包含what、obj等變數,裝一些資料。最後用sendMessage方法把message(裝好了資料的)發出去,Handler內部類的handleMessage方法就會立刻(或許要排隊)執行。個人理解是把更新UI操作的請求先排好隊,裝進一個訊息佇列,然後用Looper一個一個往外取,可以說是將子執行緒裡的一些請求交給了一個Handler去處理。當然更底層的知識暫時還沒時間學習。

另外就是什麼時候考慮可以將Handler作為一個外部類提取出來,老是內部類還說明自己java不過關。

2.AsyncTask<Params, Progress, Result>

使用AsyncTask之前,先歸納下網路訪問資料的方法:

使用HttpURLConnection或者HttpClient(Deprecated),具體的我之前都有總結。

直接回到AsyncTask<Params, Progress, Result>這個類

在主執行緒裡呼叫mTask.execute()方法,execute()方法接收的引數型別為Params型別。

主執行緒裡還可以呼叫mTask.cancel(true)方法,這會呼叫mTask裡面的onCancelled方法,具體onCancelled裡面的實現需要自己去寫。

此外就是onPreexecuted、doInBackground、onProgressUpdate、onPostExecute、onCancelled這五個方法的實現了。

注意,這裡五個方法都不可以在程式碼裡直接呼叫,還有就是這五個方法裡只有doInBackground是在子執行緒裡面執行的。

doInBackground(String... params)

使用的時候使用params[0]即可。

第二個泛型由PublishProgress(int XXX)方法接收

doInBackground這個方法裡面通過一個publishProgress(int xxx)方法,接收了一個int型別引數,也就對應著第二個泛型Integer了。

這個int型別的引數會被傳給onProgressUpdate方法,使用的語句如下

progressBar.setProgress(progresses[0]);  
textView.setText("loading..." + progresses[0] + "%"); 
第三個泛型應該是對應著result,這個是在onPostExecute(String result)方法裡面接收的。

使用語句如下:

textView.setText(result);

AsyncTask可以用於後臺實現進度條

自己找到的文章大部分都是使用一個HtttpClient去request百度的首頁,然後使用一個進度條展示讀取response的進度的。

知道這麼回事就好,比較欣慰的是,自己今天總算提取出了一個Util類,今後可以多多使用了。
最後是程式碼參考的文章,感謝原作者。