android|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 线程
【android|android 多线程 — AsyncTask 使用】不墨迹,AsyncTask 就这么多,上面的知道了就会用了,下面有一些注意点:
  • AsyncTask 的实例必须在UI 线程中创建
  • execute方法必须在UI 线程中调用
  • 不要手动的调用onPreExecute(), onPostExecute(Result),doInBackground(Params...), onProgressUpdate(Progress...)这几个方法,没意义不会按我们想的去执行,他们都是作为回调函数在相应的位置执行才有效
  • AsyncTask 对象只能被执行一次,否则多次调用时将会出现异常

    推荐阅读