【问题标题】:Do I need to manage the Android asynchronous task lifecycle?我需要管理 Android 异步任务生命周期吗?
【发布时间】:2012-08-21 21:06:52
【问题描述】:

我是否需要在片段 onDestroy 事件中对 asyncTask 调用取消,以防当用户点击后退按钮并离开活动时异步任务尚未完成?

如果上次访问 fragmentActivity 的 asyncTask 仍在运行、尚未完成或尚未取消,我是否还需要检查我的 asyncTask 的现有实例是否仍在运行?

【问题讨论】:

  • 如果它正在做一些你希望它在用户退出/离开你应该做的活动时停止做的事情。
  • 嘿,我被否决了.... 怎么会? :(

标签: android android-asynctask android-fragments android-fragmentactivity


【解决方案1】:

你不必这样做,但你应该这样做。

原因是它一直运行到完成,并且从蜂窝开始,它甚至只为所有 asyncTasks 使用一个线程。

无论如何,asyncTask 通常应该用于短时间的任务,比如 1-10 秒。这不是一个规则,但它会帮助您实现存在 asyncTask 的原因——能够在后台运行任务。

这里有一些关于asyncTask from the API 的注释:

"AsyncTask 被设计成一个围绕 Thread 和 Handler 的辅助类 并且不构成通用线程框架。异步任务 理想情况下应用于短操作(几秒钟在 大多数。)如果您需要保持线程长时间运行, 强烈建议您使用由 java.util.concurrent 包,例如 Executor、ThreadPoolExecutor 和 未来任务。”

execute()的API:

"启动 HONEYCOMB,任务恢复为单机执行 线程避免由并行引起的常见应用程序错误 执行。如果你真的想要并行执行,你可以使用 executeOnExecutor(Executor, Params...) 这个方法的版本 线程池执行器;但是,请参阅那里的评论以获取有关警告 它的用途。”

如果您仍然希望将 asyncTask 用作后台任务,请确认它只有一个实例(并且不要忘记在不需要时取消它),或者使用 Google 建议避免使用的下一个代码:

public static <T> void runAsyncTaskInMultipleThreads(final AsyncTask<T,?,?> asyncTask,final T... params)
    {
    if(android.os.Build.VERSION.SDK_INT>=android.os.Build.VERSION_CODES.HONEYCOMB)
      asyncTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,params);
    else asyncTask.execute(params);
    }

【讨论】:

  • 感谢您的评论。有趣的是一个单一的线程。我认为取消销毁任务似乎减轻了我在测试快速跳过活动时看到的一些非法状态异常,而不是让异步任务完成。
猜你喜欢
  • 2017-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多