android 多线程 — AsyncTask 使用

AsyncTask android 提供的典型的用来实现异步任务的类,直接来看如何使用

如何使用


  1. AsyncTask 是一个 abstract 抽象基类,我们必须写一个异步任务类继承 AsyncTask
class DownloadTask extends AsyncTask {
    @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("当前下载进度:" + 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 一个这个 AsyncTask 实现类的对象,然后启动
new DownloadTask().execute();

类声明中的泛型解释


在我们声明这个 DownloadTask 继承 AsyncTask 类的时候,有3个泛型

class DownloadTask extends AsyncTask{
....
}
  1. 第一个泛型 : 表示传入的原始参数类型

  2. 第一个泛型 : 表示后台任务中间执行进度的数据类型,比如可以用在下载中

  3. 第一个泛型 : 表示最终返回结果的数据类型

  4. 若是没有参数:那么在相应位置可以写 Void

方法解释


  1. onPreExecute()
    代理 相关的准备任务,运行在 UI 线程,在后台任务前运行。

  2. doInBackground(Params)
    代理 异步任务,运行在独立的线程中,期中可以使用 publishProgress(downloadPercent) 方法更新任务进度,比如下载任务,最后把获取都的数据返回, 没有返回 null

  3. onProgressUpdate(Progress...)
    用于更新进度,运行在 UI 线程

  4. onPostExecute(result)
    获取最终结果,运行在 UI 线程

不墨迹,AsyncTask 就这么多,上面的知道了就会用了,下面有一些注意点:

  • AsyncTask 的实例必须在UI 线程中创建
  • execute方法必须在UI 线程中调用
  • 不要手动的调用onPreExecute(), onPostExecute(Result),doInBackground(Params...), onProgressUpdate(Progress...)这几个方法,没意义不会按我们想的去执行,他们都是作为回调函数在相应的位置执行才有效
  • AsyncTask 对象只能被执行一次,否则多次调用时将会出现异常

你可能感兴趣的:(android 多线程 — AsyncTask 使用)