在Android开发中,处理复杂任务时,为了避免应用界面冻结,通常需要将这些任务放在后台线程执行。根据Android开发者文档的建议,使用AsyncTask是实现这一目标的推荐方式。为了等待任务完成并报告当前状态,通常还会使用ProgressDialog。在理想情况下,这些组件能够很好地协同工作,而且不需要编写大量的代码。但是,当开始更改配置(例如屏幕旋转)时,Android会重新创建Activity,或者当尝试在不同的Activity中重复相同的功能时,问题就出现了。
为了避免在Activity中编写大量的支持代码,决定将这些代码移到一个单独的类中,以便在项目中重复使用。Activity应该只创建特定的任务,将其传递给这个类,并提供一个回调以处理任务完成。其余的功能(显示对话框、更新进度消息、关闭对话框、调用完成处理器)是通用的,应该在这个新类AsyncTaskManager中实现。
AsyncTaskManager现在负责管理AsyncTask和ProgressDialog,其逻辑可以如下实现:
为了减少AsyncTaskManager和Activity之间的耦合,创建了一个接口,任何使用相同方法的Activity都应该实现这个接口。
public interface OnTaskCompleteListener {
void onTaskComplete(Task task);
}
Task参数最初是作为一个异步任务创建的,因此可以获取结果或检查这个任务是否被取消。
AsyncTaskManager负责AsyncTask和ProgressDialog的管理,其实现可以如下:
@Override
public void onProgress(String message) {
if (!mProgressDialog.isShowing()) {
mProgressDialog.show();
}
mProgressDialog.setMessage(message);
}
@Override
public void onCancel(DialogInterface dialog) {
mAsyncTask.cancel(true);
mTaskCompleteListener.onTaskComplete(mAsyncTask);
mAsyncTask = null;
}
AsyncTask实现有一个特殊方法来分配IProgressTracker实例,允许轻松地将任务附加和分离到其他代码中,这些代码在配置更改时每次都会被重新创建:
public void setProgressTracker(IProgressTracker progressTracker) {
mProgressTracker = progressTracker;
if (mProgressTracker != null) {
mProgressTracker.onProgress(mProgressMessage);
if (mResult != null) {
mProgressTracker.onComplete();
}
}
}