AsyncTask android 提供的典型的用來實(shí)現(xiàn)異步任務(wù)的類,直接來看如何使用
如何使用
- AsyncTask 是一個(gè) abstract 抽象基類,我們必須寫一個(gè)異步任務(wù)類繼承 AsyncTask
class DownloadTask extends AsyncTask<Void, Integer, Boolean> {
@Override
protected void onPreExecute() {
progressDialog.show();
}
@Override
protected Boolean doInBackground(Void... params) {
try {
while (true) {
int downloadPercent = doDownload();
publishProgress(downloadPercent);
if (downloadPercent >= 100) {
break;
}
}
} catch (Exception e) {
return false;
}
return true;
}
@Override
protected void onProgressUpdate(Integer... values) {
progressDialog.setMessage("當(dāng)前下載進(jìn)度:" + values[0] + "%");
}
@Override
protected void onPostExecute(Boolean result) {
progressDialog.dismiss();
if (result) {
Toast.makeText(context, "下載成功",Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(context, "下載失敗",Toast.LENGTH_SHORT).show();
}
}
}
- 在 UI 線程中,new 一個(gè)這個(gè) AsyncTask 實(shí)現(xiàn)類的對(duì)象,然后啟動(dòng)
new DownloadTask().execute();
類聲明中的泛型解釋
在我們聲明這個(gè) DownloadTask 繼承 AsyncTask 類的時(shí)候,有3個(gè)泛型
class DownloadTask extends AsyncTask<Void, Integer, Boolean>{
....
}
第一個(gè)泛型 : 表示傳入的原始參數(shù)類型
第一個(gè)泛型 : 表示后臺(tái)任務(wù)中間執(zhí)行進(jìn)度的數(shù)據(jù)類型,比如可以用在下載中
第一個(gè)泛型 : 表示最終返回結(jié)果的數(shù)據(jù)類型
若是沒有參數(shù):那么在相應(yīng)位置可以寫 Void
方法解釋
onPreExecute()
代理 相關(guān)的準(zhǔn)備任務(wù),運(yùn)行在 UI 線程,在后臺(tái)任務(wù)前運(yùn)行。doInBackground(Params)
代理 異步任務(wù),運(yùn)行在獨(dú)立的線程中,期中可以使用 publishProgress(downloadPercent) 方法更新任務(wù)進(jìn)度,比如下載任務(wù),最后把獲取都的數(shù)據(jù)返回, 沒有返回 nullonProgressUpdate(Progress...)
用于更新進(jìn)度,運(yùn)行在 UI 線程onPostExecute(result)
獲取最終結(jié)果,運(yùn)行在 UI 線程
不墨跡,AsyncTask 就這么多,上面的知道了就會(huì)用了,下面有一些注意點(diǎn):
- AsyncTask 的實(shí)例必須在UI 線程中創(chuàng)建
- execute方法必須在UI 線程中調(diào)用
- 不要手動(dòng)的調(diào)用onPreExecute(), onPostExecute(Result),doInBackground(Params...), onProgressUpdate(Progress...)這幾個(gè)方法,沒意義不會(huì)按我們想的去執(zhí)行,他們都是作為回調(diào)函數(shù)在相應(yīng)的位置執(zhí)行才有效
- AsyncTask 對(duì)象只能被執(zhí)行一次,否則多次調(diào)用時(shí)將會(huì)出現(xiàn)異常