【发布时间】:2011-10-04 22:02:49
【问题描述】:
使用异步任务的正确方法是什么? 假设用户进入一个活动,异步任务启动,当异步任务运行时,用户决定导航到另一个页面。
- anynctask 会发生什么?它会一直运行到完成吗?
- 我是否有责任以某种方式停止此异步任务?
【问题讨论】:
使用异步任务的正确方法是什么? 假设用户进入一个活动,异步任务启动,当异步任务运行时,用户决定导航到另一个页面。
【问题讨论】:
异步任务将继续运行。当 Android 操作系统在内存不足时尝试回收内存时,异步任务可能会死掉。如果您不在乎异步任务可能无法完成,那么也许这无关紧要,但这是不好的做法。
此外,根据您存储/处理结果的方式,当异步任务终止时,您可能会尝试编辑该活动中不再存在的活动/对象,从而导致空指针异常和其他坏事。这样做的正确方法是从您的活动中启动一个服务,然后从该服务中启动一个异步任务。您应该遵循 Google IO 2010 上本次演讲中概述的设计模式之一:
Android REST Client Design Patterns
这个话题很有趣,但很难理解,而且没有给出代码,所以这是我用来学习这些东西的一个很好的教程:
Downloading Data with Services
此外,android 将为您管理异步任务的线程池(我相信当您的进程中有 5 个以上时它会开始杀死它们),您不必杀死它们。在这里查看答案:
【讨论】:
我想快点:
如果不对您的程序造成负面影响,您必须负责停止异步任务。阅读this。
你的 asynctask 会通过 onPreExecute()-doInBackground(Params...)-onPostExecute(Result)-End of asynctask life
【讨论】:
是的,如果您在导航到另一个 Activity 时没有停止它,AsyncTask 将继续运行。即使设备的配置发生变化(例如旋转),它也会继续运行。如果你想在 postExecute() 上做一些对 UI 有影响的事情,那么你必须确保你在这个方法中修改的 UI 小部件的引用是有效的,即使在旋转之后,当 Activity 重新创建时也是如此。
是的,如果您不需要 AsyncTask,您有责任停止(即 .cancel())。但是请注意,处于执行过程中的 AsyncTask 不会仅仅因为您在其上调用了 .cancel() 而停止。它会继续运行,但任务完成时不会调用它的 postExecute() 方法。
【讨论】: