我是否需要管理Android异步任务生命周期?

top*_*wik 2 android android-asynctask android-fragments android-fragmentactivity

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

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

and*_*per 6

你不必,但你应该.

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

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

以下是API中有关asyncTask的一些注意事项:

"AsyncTask被设计成一个围绕Thread和Handler的助手类,并不构成一个通用的线程框架.AsyncTasks理想情况下应该用于短操作(最多几秒钟.)如果你需要保持线程长时间运行时间,强烈建议您使用java.util.concurrent pacakge提供的各种API,例如Executor,ThreadPoolExecutor和FutureTask."

execute()的 API :

"启动HONEYCOMB,任务重新开始在单个线程上执行,以避免由并行执行引起的常见应用程序错误.如果您真的想要并行执行,可以使用THREAD_POOL_EXECUTOR执行此方法的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);
    }
Run Code Online (Sandbox Code Playgroud)