最近閑來無事,遂看了一下android文檔
其中AsyncTask類以前未用過,這裡學習并記錄一下:
AsyncTask ,見名知意,就是異步任務的意思。android為什麼要提供這個類呢?自然有他的妙處和巧處。
我們知道,在android中非UI線程是無法對UI進行操作的,而比較耗時的任務,我們一般考慮到UI卡死,不會直接放在UI線程中來完成,而是
另開辟一個線程來完成這個耗時的任務。這樣,在另一個線程中當任務完成時,需要将任務的執行結果。回報到UI怎麼辦呢?
對,除了可以使用Activity的runOnUiTread(Runnable)方法,還有一個同樣友善的類,就是AsyncTask。下面是我對SDK文檔的翻譯了,自己的話。總感覺别扭。呵呵。
一、簡介:
AsyncTask 類允許你友善正确地使用UI線程。該類可以将耗時的操作放在背景來處理,而不需要人為地另開線程或者使用handlers來完成。
當需要開辟一個背景線程并且其運作結果需要反映到UI線程的時候,AsyncTask就派上用場了。定義一個AsyncTack時,需要指定3種類 型(Params,Progress,Result),完成4個步驟 (begin,doInBackground,processProgress,end)。
二、使用方法:
由于AsyncTask是個抽象類,是以,你需要定義一個類來繼承它。同時,這個子類至少需要實作doInBackground(Params…)這個方法。
同時,在多數情況下,您可能還需重寫另一個方法:onPostExecute(Result)。
下面是文檔中的執行個體:
private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {
protected Long doInBackground(URL… urls) {
int count = urls.length;
long totalSize = 0;
for (int i = 0; i < count; i++) {
totalSize += Downloader.downloadFile(urls[i]);
publishProgress((int) ((i / (float) count) * 100));
}
return totalSize;
}
protected void onProgressUpdate(Integer… progress) {
setProgressPercent(progress[0]);
protected void onPostExecute(Long result) {
showDialog(“Downloaded ” + result + ” bytes”);
}
一旦定義類AsyncTask的子類,您就可以直接使用 new DownloadFilesTask().execute(url1,url2,url3)來執行一個任務;
三、AsyncTask的三種範型:
1、Params:任務執行時需要的參數類型,(就是execute方法傳入的類型)。
2、Progress:背景計算中使用的進度機關資料類型
3、Result:任務執行結果的類型
注意:并不是所有的類型都需要,如果某個類型不需要,用Void,如:
private class MyTask extends AsyncTask<Void, Void, Void>{…}
四、AsyncTask的四個階段(步驟)
當一個任務被執行的時候,他就需要經過下面四個階段。
1、onPreExecute();這個方法,在調用execute()後,立即在UI線程中被執行,該方法通常用于對任務做一些基本的設定,比如在使用者界面上顯示一個進度條。
2、doInBackground(Params…);這個方法,在onPreExecute()執行完成後,在背景運作。這個方法中就是完成 耗時操作。異步任務的Params參數傳入該方法,同時,方法的執行結果需要傳回,同時需要傳入下一個階段的方法。在這個方法中還可以使用 publishProgress(Progress…)改變目前的進度值。這些值将會在onProgressUpdate(Progress…) 方法中同步顯示在UI線程。
3、onProgressUpdate(Progress…);這個方法是在publishProgress(Progress…)方法被 調用之後,在UI線程中執行的。以便背景任務在執行的時候,在使用者界面可以顯示各種進度資訊。例如:可以用進度條模拟進度或者在文本域中顯示進度日志。
4、onPostExecute(Result); 該方法在背景任務完成後由UI線程調用,背景任務的執行結果作為參數傳入該方法。
五、正确使用該類需要注意的幾點:
1、這個類的執行個體需要在UI線程中建立
2、execute(Params…)方法必須在UI線程中調用
3、不要人為地調用上面四個步驟對應的方法。
4、一個任務隻能執行一次。如果再次請求一個執行,将會報異常。
<a href="http://www.ijavaboy.com/85.html">說說Android桌面背後的故事(十)——讓Widget擁有Application同等的待遇</a>
<a href="http://www.ijavaboy.com/%E8%AF%B4%E8%AF%B4android%E6%A1%8C%E9%9D%A2%E8%83%8C%E5%90%8E%E7%9A%84%E6%95%85%E4%BA%8B%E4%B9%9D-%E8%AE%A9%E6%88%91%E7%9A%84%E6%A1%8C%E9%9D%A2%E5%A4%9A%E5%A7%BF%E5%A4%9A%E5%BD%A9.html">說說Android桌面背後的故事(九)——讓我的桌面多姿多彩</a>
<a href="http://www.ijavaboy.com/%E8%AF%B4%E8%AF%B4android%E6%A1%8C%E9%9D%A2%E8%83%8C%E5%90%8E%E7%9A%84%E6%95%85%E4%BA%8B%E5%85%AB-%E8%AE%A9%E6%A1%8C%E9%9D%A2%E7%9A%84%E7%B2%BE%E7%81%B5%E7%A9%BF%E8%B6%8A%E8%B5%B7.html">說說Android桌面背後的故事(八)——讓桌面的精靈穿越起來</a>