Android - 使用AsyncTasks的正确方法?

时间:2011-10-04 22:02:49

标签: android android-asynctask

使用asynctasks的正确方法是什么? 假设用户输入一个活动,asynctask开始,当asynctask正在运行时,用户决定导航到另一个页面。

  • 任何事情都会发生什么?它会一直运行直到它完成了吗?
  • 我有责任以某种方式停止这个asynctask吗?

3 个答案:

答案 0 :(得分:5)

asynctask将继续运行。 asynctask可能会因为Android操作系统在低速运行时尝试回收内存而死亡。如果您不在乎异步任务可能无法完成,那么这可能无关紧要,但这是不好的做法。

此外,当异步任务根据您存储/处理结果的方式而死时,您可能会尝试编辑该活动中不再存在的活动/对象,从而导致nullpointerexceptions和其他不良事件。 正确这样做的方法是从您的活动启动服务并从服务启动asynctask。您应该遵循Google IO 2010中的演讲中列出的设计模式之一:

Android REST Client Design Patterns

这个说法很有趣,但很难遵循,也没有提供任何代码,所以这是一个很好的教程,我曾经学过这些东西:

Downloading Data with Services

此外,android会为你管理你的异步任务的线程池(我相信它会在你的进程中超过5时开始杀死它们),你不必杀死它们。看看这里的答案:

How AsyncTasks die

答案 1 :(得分:0)

生病了,试着加快速度:

  • 如果不对你的程序产生负面影响,你必须有责任停止asynctask。阅读this

  • 你的asynctask会在onPreExecute()中传递它的生命 - doInBackground(Params ...) - onPostExecute(Result) - asnctask life的终结

  • Asynctask已经完成只执行一次,如果你想再次执行它你必须创建另一个

答案 2 :(得分:0)

  1. 是的,如果在导航到另一个Activity时没有停止,AsyncTask将继续运行。即使设备的配置发生变化(例如它旋转),它也会继续运行。如果你想对postExecute()做一些对UI有影响的事情,那么你必须确保在重新创建Activity时,即使在轮换之后,你在这个方法中修改的UI小部件的引用也是有效的。

  2. 是的,如果您不需要,您有责任停止(即.cancel())AsyncTask。但请注意,处于执行过程中的AsyncTask不会因为您在其上调用.cancel()而停止。它将继续运行,但在任务完成时不会调用它的postExecute()方法。