异步任务管理器在Android开发中的应用

在Android开发中,处理复杂任务时,为了避免应用界面冻结,通常需要将这些任务放在后台线程执行。根据Android开发者文档的建议,使用AsyncTask是实现这一目标的推荐方式。为了等待任务完成并报告当前状态,通常还会使用ProgressDialog。在理想情况下,这些组件能够很好地协同工作,而且不需要编写大量的代码。但是,当开始更改配置(例如屏幕旋转)时,Android会重新创建Activity,或者当尝试在不同的Activity中重复相同的功能时,问题就出现了。

Activity清理

为了避免在Activity中编写大量的支持代码,决定将这些代码移到一个单独的类中,以便在项目中重复使用。Activity应该只创建特定的任务,将其传递给这个类,并提供一个回调以处理任务完成。其余的功能(显示对话框、更新进度消息、关闭对话框、调用完成处理器)是通用的,应该在这个新类AsyncTaskManager中实现。

AsyncTaskManager现在负责管理AsyncTask和ProgressDialog,其逻辑可以如下实现:

  • 在任务分配时创建对话框
  • 将任务状态(进度消息)绑定到对话框并运行任务
  • 当任务应该保留时,从任务中解绑对话框,并在恢复时重新绑定
  • 当对话框取消时取消任务
  • 在任务完成时关闭对话框
  • 通过OnTaskCompleteListener向Activity报告任务取消或完成

为了减少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(); } } }
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485