Android AsyncTask 简单用法

时间:2022-01-22 22:40:31

简介

AsyncTask 是一个轻量级的异步处理类。使用是需继承自该类。可以方便的执行异步任务并且在将进度显示在UI上。

注意事项

  • AsyncTask只适合处理轻量级的任务即耗时几秒或者几十秒的任务。如果需要长时间执行后台异步任务,可以查阅java.util.concurrent 包中的 Executor, ThreadPoolExecutor 以及 FutureTask等内容。

  • 使用AsyncTask必须创建一个类继承自AsyncTask,至少需要重写doInBackground(params...) 方法执行具体的操作。一般会重写onPostExecute(Result)方法用来执行后台操作以及对后台运行结果进行处理。

AsyncTask 执行的4个阶段

  • step1

onPreExecute() 在主线程(UI线程)调用,用于开始任务前的初始化工作。例如显示一个进度条。

  • step2

doInBackground(Params...) 后台线程调用,onPreExecute() 执行完之后立即执行。用于执行耗时较长的操作。并且提供publishProgress(Progress...)方法用于显示进度信息。

  • step3

onProgressUpdate (Progress...)在主线程(UI线程)调用,用于响应publishProgress(Progress...)方法。

  • step4

onPostExecute(Result) 在主线程调用,doInBackground(Params...)方法执行完后立即调用。Result是doInBackground(Params...)方法的返回值。

AsyncTask使用方法

  • 构造函数 可以自定义public类型的构造函数,和普通的类没有差别。
  • AsyncTask每次使用必须new 一个对象,并且执行excute(Params...)方法。Params参数解释见下文。

参数解释

这三个参数会在类继承时被指定,参数都使用泛型构造。

  • Params 后台线程所需要的参数列表,与构造类时所指定的第一个参数类型匹配。
  • Progress 后台线程执行过程中发送的进度信息, 与构造类时所指定的第二个参数类型匹配。
  • Result 后台线程执行完后的返回值, 与构造类时所指定的第三个参数类型匹配。

代码示例(来自Android Developer)

  • Class definition
    private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {
protected Long doInBackground(URL... urls) {
int count = urls.length; 
long totalSize = 0;
for (int i = 0; i < count; i++) {
totalSize += Downloader.downloadFile(urls[i]);
publishProgress((int) ((i / (float) count) * 100));
// Escape early if cancel() is called
if (isCancelled()) break;
}
return totalSize;
}
protected void onProgressUpdate(Integer... progress) {
setProgressPercent(progress[0]);
}
protected void onPostExecute(Long result) {
showDialog("Downloaded " + result + " bytes");
}
}
  • Use
    new DownloadFilesTask().execute(url1, url2, url3);

更多用法AsyncTask AndroidDeveloper