android 多線程 — AsyncTask 使用

AsyncTask android 提供的典型的用來實(shí)現(xiàn)異步任務(wù)的類,直接來看如何使用

如何使用


  1. 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();
        }
    }
}
  1. 在 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>{
....
}
  1. 第一個(gè)泛型 : 表示傳入的原始參數(shù)類型

  2. 第一個(gè)泛型 : 表示后臺(tái)任務(wù)中間執(zhí)行進(jìn)度的數(shù)據(jù)類型,比如可以用在下載中

  3. 第一個(gè)泛型 : 表示最終返回結(jié)果的數(shù)據(jù)類型

  4. 若是沒有參數(shù):那么在相應(yīng)位置可以寫 Void

方法解釋


  1. onPreExecute()
    代理 相關(guān)的準(zhǔn)備任務(wù),運(yùn)行在 UI 線程,在后臺(tái)任務(wù)前運(yùn)行。

  2. doInBackground(Params)
    代理 異步任務(wù),運(yùn)行在獨(dú)立的線程中,期中可以使用 publishProgress(downloadPercent) 方法更新任務(wù)進(jìn)度,比如下載任務(wù),最后把獲取都的數(shù)據(jù)返回, 沒有返回 null

  3. onProgressUpdate(Progress...)
    用于更新進(jìn)度,運(yùn)行在 UI 線程

  4. 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)異常
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容