使用asynctasks的正确方法是什么? 假设用户输入一个活动,asynctask开始,当asynctask正在运行时,用户决定导航到另一个页面。
答案 0 :(得分:5)
asynctask将继续运行。 asynctask可能会因为Android操作系统在低速运行时尝试回收内存而死亡。如果您不在乎异步任务可能无法完成,那么这可能无关紧要,但这是不好的做法。
此外,当异步任务根据您存储/处理结果的方式而死时,您可能会尝试编辑该活动中不再存在的活动/对象,从而导致nullpointerexceptions和其他不良事件。 正确这样做的方法是从您的活动启动服务并从服务启动asynctask。您应该遵循Google IO 2010中的演讲中列出的设计模式之一:
Android REST Client Design Patterns
这个说法很有趣,但很难遵循,也没有提供任何代码,所以这是一个很好的教程,我曾经学过这些东西:
Downloading Data with Services
此外,android会为你管理你的异步任务的线程池(我相信它会在你的进程中超过5时开始杀死它们),你不必杀死它们。看看这里的答案:
答案 1 :(得分:0)
生病了,试着加快速度:
如果不对你的程序产生负面影响,你必须有责任停止asynctask。阅读this。
你的asynctask会在onPreExecute()中传递它的生命 - doInBackground(Params ...) - onPostExecute(Result) - asnctask life的终结
答案 2 :(得分:0)
是的,如果在导航到另一个Activity时没有停止,AsyncTask将继续运行。即使设备的配置发生变化(例如它旋转),它也会继续运行。如果你想对postExecute()做一些对UI有影响的事情,那么你必须确保在重新创建Activity时,即使在轮换之后,你在这个方法中修改的UI小部件的引用也是有效的。
是的,如果您不需要,您有责任停止(即.cancel())AsyncTask。但请注意,处于执行过程中的AsyncTask不会因为您在其上调用.cancel()而停止。它将继续运行,但在任务完成时不会调用它的postExecute()方法。