AsyncTask 只是 Android SDK 提供的一个“帮助”类,以便在后台任务完成后更容易跳到 UI 线程。它建立在标准的 Java 线程 API 之上。它不会提供仅用线程无法完成的事情。它解决了在短任务运行后台线程和UI线程之间切换的常见场景。
一般来说,当后台任务完成后必须“跳回”到 UI 线程或在任务执行期间必须向 UI 线程提供一些反馈时,使用 AsyncTask 会很方便。否则只是开销。
您不必强制使用 AsyncTask。如果您作为开发人员更喜欢直接使用Threads 或Futures,您可以使用它并在后台任务完成后手动跳到 UI 线程。
编辑:
此处的其他一些答案表明,使用 AsyncTask 应仅限于短任务。据称是因为它使用了一个公共池。然而,自从 API 级别 11 以来,它不再是正确的(所以,在相当长的一段时间内)。您可以使用executeOnExecutor 而不是execute 在专用线程池中执行AsyncTask。见http://developer.android.com/reference/android/os/AsyncTask.html#executeOnExecutor%28java.util.concurrent.Executor,%20Params...%29
因为示例通常更具交流性,请看下面的示例。
假设我们有一个静态函数来完成一些繁重的任务和一个 TextView,我们想要显示任务的进度和最终状态,声明如下:
static Object doHeavyTask(String string) throws Exception;
TextView progressInfo;
使用异步任务在后台线程中执行任务如下所示:
new AsyncTask<String, Integer, Exception>() {
@Override
protected Exception doInBackground(String... params) {
for (int i = 0; i < params.length; i++) {
try {
doHeavyTask(params[i]);
} catch (Exception e) {
return e;
}
publishProgress(i, params.length);
}
return null;
}
@Override
protected void onProgressUpdate(Integer... values) {
progressInfo.setText("Executed " + values[0] +
" of " + values[1] + " tasks.");
}
@Override
protected void onPostExecute(Exception result) {
if (result == null) {
progressInfo.setText("Heavy background job done successfully!");
}
else {
progressInfo.setText("Heavy background job failed!" +
"Exception message: " + result.getMessage());
}
}
}.execute("input1", "input2", "input3");
使用 Thread 也可以实现完全相同的效果:
final Handler handler = new Handler(Looper.getMainLooper());
final String[] params = { "input1", "input2", "input3" };
new Thread() {
@Override
public void run() {
for (int i = 0; i < params.length; i++) {
try {
doHeavyTask(params[i]);
} catch (final Exception e) {
handler.post(new Runnable() {
@Override
public void run() {
progressInfo.setText("Heavy background job failed!" +
"Exception message: " + e.getMessage());
}
});
return;
}
final int currentIndex = i;
handler.post(new Runnable() {
@Override
public void run() {
progressInfo.setText("Executed " + currentIndex +
" of " + params.length + " tasks.");
}
});
}
handler.post(new Runnable() {
@Override
public void run() {
progressInfo.setText(
"Heavy background job done successfully!");
}
});
}
}.start();
正如您在上面看到的,使用 AsyncTask 更方便一些。但是没有其他优势,就是这种方便:)。
如果您准备了自己的任务来封装 Thread(以及一个 Handler 以跳回 UI 线程),那么您的类可能会更高效/更方便您使用。
就是这样:)。