当用户单击back按钮并离开活动时,我是否需要在fragment onDestroy事件中的asyncTask上调用cancel,以防异步任务尚未完成?
我是否还需要检查我的asyncTask的现有实例是否仍在运行,以防上次访问fragmentActivity的asyncTask仍在运行、尚未完成或尚未取消?
发布于 2012-08-22 05:16:30
你不必这样做,但你应该这样做。
原因是它一直运行到结束,并且从蜂窝开始,它甚至只使用一个线程来处理所有asyncTasks。
无论如何,asyncTask通常应该用于短时间的任务,比如1-10秒。这不是一条规则,但它将帮助您实现asyncTask的原因--能够在后台运行任务。
以下是关于asyncTask from the API的一些注意事项:
"AsyncTask被设计为一个围绕线程和处理程序的辅助类,并不构成通用的线程框架。理想情况下,AsyncTasks应该用于短操作(最多几秒)。如果您需要让线程长时间运行,强烈建议您使用java.util.concurrent包提供的各种API,如Executor、ThreadPoolExecutor和FutureTask。“
execute()的接口
“从蜂巢开始,任务返回到在单个线程上执行,以避免由并行执行导致的常见应用程序错误。如果您确实希望并行执行,可以将此方法的executeOnExecutor(Executor,Params...)版本与THREAD_POOL_EXECUTOR一起使用;但是,请参阅此处的注释以了解有关其使用的警告。”
如果您无论如何都希望使用asyncTask作为后台任务,请验证它是否只有一个实例(当不需要时,不要忘记取消它),或者使用谷歌建议避免的以下代码:
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);
}https://stackoverflow.com/questions/12063053
复制相似问题