AsyncTask
是 Android 中用于在后台线程执行异步任务并将结果传递到主线程的一种工具类。它简化了线程的使用,尤其是在需要更新 UI 的场景中。
AsyncTask
的主要目的是避免直接操作线程和 Handler
,提供一种更简单的异步任务实现方式。
AsyncTask 的基本结构
AsyncTask
是一个抽象类,通常需要继承它并实现以下方法:
-
doInBackground(Params... params)
在后台线程中执行耗时操作,必须实现。 -
onPreExecute()
在任务开始之前运行,通常用于初始化操作(运行在主线程)。 -
onPostExecute(Result result)
在任务完成后运行,接收doInBackground
的结果并更新 UI(运行在主线程)。 -
onProgressUpdate(Progress... values)
用于在任务执行过程中更新进度(运行在主线程)。 -
onCancelled()
当任务被取消时调用。
AsyncTask 的泛型参数
AsyncTask<Params, Progress, Result>
中的泛型参数:
Params
:传递给任务的输入参数类型。Progress
:任务执行过程中进度更新的类型。Result
:任务完成后返回的结果类型。
使用方式
1. 基本使用
private class MyTask extends AsyncTask<String, Integer, String> {
@Override
protected void onPreExecute() {
super.onPreExecute();
// 初始化操作,例如显示进度条
}
@Override
protected String doInBackground(String... params) {
// 执行耗时操作
for (int i = 0; i < 100; i++) {
publishProgress(i); // 更新进度
try {
Thread.sleep(50); // 模拟耗时操作
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return "任务完成";
}
@Override
protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
// 更新 UI,例如更新进度条
int progress = values[0];
Log.d("LOG_TAG", "当前进度:" + progress + "%");
}
@Override
protected void onPostExecute(String result) {
super.onPostExecute(result);
// 任务完成后更新 UI
System.out.println(result);
}
}
// 调用任务
new MyTask().execute("参数1");
2. 取消任务
MyTask task = new MyTask();
task.execute();
task.cancel(true); // 取消任务
在 doInBackground
中需要定期检查 isCancelled()
:
@Override
protected String doInBackground(String... params) {
for (int i = 0; i < 100; i++) {
if (isCancelled()) {
return "任务被取消";
}
publishProgress(i);
try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return "任务完成";
}
3. 多任务并行执行
默认情况下,AsyncTask
是串行执行的。如果需要并行执行,可以使用 executeOnExecutor
:
new MyTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, "参数1");
注意事项
-
内存泄漏
AsyncTask
持有对外部类的引用,可能导致内存泄漏。建议使用静态内部类或弱引用。 -
生命周期问题
如果AsyncTask
在Activity
或Fragment
销毁后仍在运行,可能会导致崩溃。需要在销毁时取消任务。 -
性能问题
AsyncTask
适合轻量级任务,不适合长时间运行的任务。对于复杂任务,建议使用ExecutorService
或WorkManager
。
注意
AsyncTask
在 Android API 30(API 级别为 11)中已被废弃。官方推荐使用 Kotlin 的协程(Coroutines)或者 Java 的其他并发工具(如 ExecutorService, Executors,WorkManager 等)来替代 AsyncTask。