AsyncTask android 提供的典型的用来实现异步任务的类,直接来看如何使用
如何使用
- AsyncTask 是一个 abstract 抽象基类,我们必须写一个异步任务类继承 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("当前下载进度:" + 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 一个这个 AsyncTask 实现类的对象,然后启动
new DownloadTask().execute();
类声明中的泛型解释
在我们声明这个 DownloadTask 继承 AsyncTask 类的时候,有3个泛型
class DownloadTask extends AsyncTask<Void, Integer, Boolean>{
....
}
-
第一个泛型 : 表示传入的原始参数类型
-
第一个泛型 : 表示后台任务中间执行进度的数据类型,比如可以用在下载中
-
第一个泛型 : 表示最终返回结果的数据类型
-
若是没有参数:那么在相应位置可以写 Void
方法解释
-
onPreExecute()
代理 相关的准备任务,运行在 UI 线程,在后台任务前运行。 -
doInBackground(Params)
代理 异步任务,运行在独立的线程中,期中可以使用 publishProgress(downloadPercent) 方法更新任务进度,比如下载任务,最后把获取都的数据返回, 没有返回 null -
onProgressUpdate(Progress...)
用于更新进度,运行在 UI 线程 -
onPostExecute(result)
获取最终结果,运行在 UI 线程
不墨迹,AsyncTask 就这么多,上面的知道了就会用了,下面有一些注意点:
- AsyncTask 的实例必须在UI 线程中创建
- execute方法必须在UI 线程中调用
- 不要手动的调用onPreExecute(), onPostExecute(Result),doInBackground(Params...), onProgressUpdate(Progress...)这几个方法,没意义不会按我们想的去执行,他们都是作为回调函数在相应的位置执行才有效
- AsyncTask 对象只能被执行一次,否则多次调用时将会出现异常
网友评论