如果用户点击后退按钮并离开活动时异步任务尚未完成,我是否需要在片段 onDestroy 事件中对 asyncTask 调用取消?
如果上次访问 fragmentActivity 的 asyncTask 仍在运行、尚未完成或尚未取消,我是否还需要检查我的 asyncTask 的现有实例是否仍在运行?
如果用户点击后退按钮并离开活动时异步任务尚未完成,我是否需要在片段 onDestroy 事件中对 asyncTask 调用取消?
如果上次访问 fragmentActivity 的 asyncTask 仍在运行、尚未完成或尚未取消,我是否还需要检查我的 asyncTask 的现有实例是否仍在运行?
你不必这样做,但你应该这样做。
原因是它一直运行直到完成,并且从蜂窝开始,它甚至只为所有 asyncTasks 使用一个线程。
无论如何,asyncTask 通常应该用于短时间的任务,比如 1-10 秒。这不是一个规则,但它会帮助您实现存在 asyncTask 的原因——能够在后台运行任务。
“AsyncTask 被设计为围绕 Thread 和 Handler 的辅助类,并不构成通用线程框架。AsyncTasks 理想情况下应该用于短操作(最多几秒钟)。如果您需要保持线程长时间运行有时间,强烈推荐你使用 java.util.concurrent 包提供的各种 API,如 Executor、ThreadPoolExecutor 和 FutureTask。”
execute()的 API :
“启动HONEYCOMB,任务回到单线程执行,避免并行执行导致的常见应用程序错误。如果你真的想要并行执行,你可以使用这个方法的executeOnExecutor(Executor,Params ...)版本与THREAD_POOL_EXECUTOR ; 但是,请参阅那里的评论以获取有关其使用的警告。”
如果您仍然希望将 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);
}