gogo专业大尺度亚洲高清人体,美女张开双腿让男生桶,亚洲av无码一区二区三区鸳鸯影院,久久久久国产精品人妻

當(dāng)前位置:首頁(yè) > 嵌入式培訓(xùn) > 嵌入式學(xué)習(xí) > 講師博文 > Android異步加載AsyncTask的使用

Android異步加載AsyncTask的使用 時(shí)間:2018-09-26      來(lái)源:未知

Android系統(tǒng)給我們提供了AsyncTask這樣一個(gè)類,來(lái)幫助我們快速實(shí)現(xiàn)多線程開(kāi)發(fā),它的底層實(shí)現(xiàn),其實(shí)就是一個(gè)線程池。

AsyncTask,顧名思義就是用來(lái)做異步處理的。通過(guò)AsyncTask,我們可以非常方便的解決多線程,以及多線程之間的通信問(wèn)題。

AsyncTask參數(shù)

抽象類AsyncTask具有三個(gè)泛型參數(shù):

AsyncTask

Params: 這個(gè)泛型指定的是我們傳遞給異步任務(wù)執(zhí)行時(shí)的參數(shù)的類型

Progress: 這個(gè)泛型指定的是我們的異步任務(wù)在執(zhí)行的時(shí)候?qū)?zhí)行的進(jìn)度返回給UI線程的參數(shù)的類型

Result: 這個(gè)泛型指定的異步任務(wù)執(zhí)行完后返回給UI線程的結(jié)果的類型

我們?cè)趧?chuàng)建AsyncTask的時(shí)候,需要指定這三個(gè)參數(shù)。

AsyncTask方法

AsyncTask具有這樣幾個(gè)抽象方法:

onPreExecute(): 這個(gè)方法是在執(zhí)行異步任務(wù)之前的時(shí)候執(zhí)行,并且是在UI Thread當(dāng)中執(zhí)行的,通常我們?cè)谶@個(gè)方法里做一些UI控件的初始化的操作,例如彈出ProgressDialog

doInBackground(Params... params): 在onPreExecute()方法執(zhí)行完之后,會(huì)馬上執(zhí)行這個(gè)方法,這個(gè)方法就是來(lái)處理異步任務(wù)的方法,

Android操作系統(tǒng)會(huì)在后臺(tái)的線程池當(dāng)中開(kāi)啟一個(gè)worker thread來(lái)執(zhí)行我們的這個(gè)方法,所以這個(gè)方法是在worker thread當(dāng)中執(zhí)行的,這個(gè)方法執(zhí)行完之后就可以將我們的執(zhí)行結(jié)果發(fā)送給我們的后一個(gè) onPostExecute 方法,因此,doInBackground是這四個(gè)方法中唯一必須要重寫的方法,在這個(gè)方法中,我們可以從網(wǎng)絡(luò)當(dāng)中獲取數(shù)據(jù)等一些耗時(shí)操作

onProgressUpdate(Progess... values): 這個(gè)方法也是在UI Thread當(dāng)中執(zhí)行的,我們?cè)诋惒饺蝿?wù)執(zhí)行的時(shí)候,

有時(shí)候需要將執(zhí)行的進(jìn)度返回給我們的UI界面,例如下載一張網(wǎng)絡(luò)圖片,我們需要時(shí)刻顯示其下載的進(jìn)度,

就可以使用這個(gè)方法來(lái)更新我們的進(jìn)度。這個(gè)方法在調(diào)用之前,我們需要在 doInBackground 方法中

調(diào)用一個(gè) publishProgress(Progress) 的方法來(lái)將我們的進(jìn)度時(shí)時(shí)刻刻傳遞給 onProgressUpdate 方法從而來(lái)更新進(jìn)度

onPostExecute(Result... result): 當(dāng)我們的異步任務(wù)執(zhí)行完之后,就會(huì)將結(jié)果返回給這個(gè)方法,這個(gè)方法也是在UI Thread當(dāng)中調(diào)用的,

我們可以將返回的結(jié)果顯示在UI控件上

AsyncTask使用

現(xiàn)在回到我們的例子中,我們利用AsyncTask來(lái)下載圖像,當(dāng)然,下載圖像的方法還是使用那個(gè)getBitmapFromUrl()方法。首先,我們先寫一個(gè)ASyncDownloadImage類,繼承AsyncTask:

private class ASyncDownloadImage extends AsyncTask {

private ImageView imageView;

private String url;

public ASyncDownloadImage(ImageView imageView, String url) {

this.imageView = imageView;

this.url = url;

}

@Override

protected Bitmap doInBackground(String... params) {

return getBitmapFromUrl(params[0]);

}

@Override

protected void onPostExecute(Bitmap bitmap) {

super.onPostExecute(bitmap);

if (imageView.getTag().equals(url)) {

imageView.setImageBitmap(bitmap);

}

}

}

這個(gè)AsyncTask我們重寫了doInBackground用來(lái)異步下載圖像,重寫了onPostExecute來(lái)將圖像設(shè)置到ImageView上。因此,我們將AsyncTask的三個(gè)泛型參數(shù)設(shè)置為:

AsyncTask

即參數(shù)類型為String——url,進(jìn)度類型——Void 不需要,返回類型——Bitmap 下載的圖像。在設(shè)置圖像的時(shí)候,我們同樣需要通過(guò)tag來(lái)進(jìn)行判斷。

后,我們與使用多線程一樣,創(chuàng)建一個(gè)showImageByASync方法,來(lái)調(diào)用AsyncTask:

/**

* Using ASyncTask

* @param imageView

* @param url

*/

public void showImageByASync(ImageView imageView, String url) {

ASyncDownloadImage task = new ASyncDownloadImage(imageView, url);

task.execute(url);

}

AsyncTask中有幾個(gè)地方還是需要注意下的:

execute方法只能在UI線程中調(diào)用

AsyncTask實(shí)例也必須在UI線程中創(chuàng)建

AsyncTask的抽象方法不要手動(dòng)去調(diào)用,系統(tǒng)自動(dòng)會(huì)去管理

AsyncTask只能執(zhí)行一次

后,只需要將Adapter中的getView方法的mImageLoader.showImageByThread(viewHolder.imageView, url);改為如下所示即可:

mImageLoader.showImageByASync(viewHolder.imageView, url);

上一篇:Linux下多線程機(jī)制

下一篇:關(guān)于C語(yǔ)言的隱式類型轉(zhuǎn)換

熱點(diǎn)文章推薦
華清學(xué)員就業(yè)榜單
高薪學(xué)員經(jīng)驗(yàn)分享
熱點(diǎn)新聞推薦
前臺(tái)專線:010-82525158 企業(yè)培訓(xùn)洽談專線:010-82525379 院校合作洽談專線:010-82525379 Copyright © 2004-2022 北京華清遠(yuǎn)見(jiàn)科技集團(tuán)有限公司 版權(quán)所有 ,京ICP備16055225號(hào)-5,京公海網(wǎng)安備11010802025203號(hào)

回到頂部