如何结束AsyncTask onBackPress()并且如果它没有完成它仍然运行?

时间:2011-09-26 23:43:21

标签: android

我在几个活动中使用AsyncTask。

我知道如何覆盖onBackPress()。

但是当AsyncTask正在运行时,我想让用户能够返回,即使asynctask仍在运行。

我该怎么做?

当启动它的活动在它完成之前关闭时,asynctask是否仍然运行?

2 个答案:

答案 0 :(得分:6)

AsyncTasks一直运行直到完成或取消。因此,在您的情况下(用户按下Back并结束主要活动),AsyncTask将继续。

如果您确实希望从onBackPressed结束AsyncTask,那么您可以做的最好就是调用

myAsyncTask.cancel(true);

但所有这一切都是调用任务的onCancelled(),它可以设置一个取消标志,可以(通常)在doInBackground()中进行检查 - 如果设置了,任务就可以返回。

请注意,使用cancel(true)不会停止任务。文档讨论了“中断”真实案例的任务,但它们的意思是在doInBackground运行时将调用onCancelled - 此时任务有机会设置doInBackground可以检查的标志。

对于真实情况,如果任务没有实现onCancelled,和/或它没有设置/检查标志,那么任务将完成doInBackground,但是永远不会调用onPostExecute(Object) - 这相当于false的情况

答案 1 :(得分:5)

即使您的应用程序已关闭,异步任务也将继续运行。你必须要小心,因为只要你的任务仍在运行,你的任务就会泄漏你的上下文(保留在内存中),如果它有引用它(所以活动)。您可以通过WeakReference引用您的活动来避免这种情况。

您可以使用cancel(true)停止正在运行的任务。取消将让任务完成doInBackground但永远不会调用onPostExecute。您可以通过检查isCanceled()来中断您的后台例程,因此在任务被终止后返回更早。

我删除了一半帖子!

我这样做会让线程停止混乱!使用true当然会 NOT 停止实际线程。非常感谢Torid和他的answer,这证明我错了!大课程,谢谢你!