当你学习为Android开发时,你会发现如果有任何类型的进程 - 在ui线程内运行的时间超过5秒,系统将显示臭名昭着的ANR消息。那时候他们介绍这个邪恶的怪物...... AsyncTask。起初,你认为这个课程是你的救星,但是你意识到这是开发中最大的问题......处理轮换或ui事件变得如此困难,甚至是痛苦的。 你们认为这是什么...是AsyncTasks值得麻烦吗?任何其他方法,无论屏幕旋转如何,执行长时间运行的任务都不会造成问题? 我想你可能会说,嘿,你为什么不把它变成一个服务......是的,这是一个解决方案,但是让我们来看看我真正的问题。为什么我们不使用服务并完全停止使用AsyncTasks ......它们有用吗?当您可以使用服务时,为什么会使用AsyncTasks?
回答
在开发过程中,选择适合执行的组件总是很好的。您需要清除您的需求,根据它您可以选择Service
或AsyncTask
。
服务是一个独立于任何其他组件生活的Android组件。活动可能会来来去去,但如果您愿意,服务可以坚持下去。他们担任多种角色,从管理多个活动依赖的状态到用作cron作业,以处理更长的应用部件更新。
AsyncTask是一个安排在主应用程序线程上做一些工作的类。从AsyncTask的实现者和用户来看,它如何执行这一点魔法并不重要。实际上,它使用线程池和工作队列。 AsyncTask使用处理程序来帮助安排在主应用程序线程上完成的选定工作位(例如,通知用户进程更新)。
欲了解更多信息,请参阅它们之间的区别。
AsyncTasks和服务是不相称的。要么可能调用另一个,他们的目的是不同的。我只有几件事情可以添加到路西法的答案中。
要记住的一个关键是,如果你的进程在后台,主持一个服务,并被杀死,该服务将在某个时刻转世。当一个AsyncTask被杀死时,它可能在一个进程中运行,情况并非如此。这意味着在服务中完成的工作将保证在未来取得进展(尽管在何时不能保证)。如果您的工作必须完成,最好在服务中完成。
调用Service.onStart和Service.onStartCommand发生在进程的主线程中。如果您很长时间阻止了此操作,则会收到相同的“应用程序无响应”对话框。因此,一个AsyncTask在服务内部使用来做真正的工作是一件好事。
我倾向于使用从Activity启动的AsyncTasks来处理与UI相关的事物。这些往往是不需要工作的东西,而且他们的工作在未来很容易重做。例如,这可能是从磁盘读取一堆图像,或者调用Web服务来查看用户是否有任何通知。这项工作可以再次完成,如果因为进程被终止而被销毁,那么工作可能需要再次完成。
另一方面,如果您想要尽快将一组照片上传到网络,我会将其用于一个将使用一个或多个AsyncTasks执行此操作的服务。这是我想完成的工作,并且如果它被中断,想要恢复。如果您打算使用服务,请考虑使用IntentService,以便您的服务在其工作完成后停止。
- 1. 当AsyncTasks已满时会发生什么?
- 2. 当您可以使用SecureRandom类时,为什么要使用Java的随机类?
- 3. 当您无法使用ViewState时,您会做什么?
- 4. 您使用Go for web服务使用什么Web服务器?
- 5. 当您可以保护服务器(IIS)时,为什么要使用HTTPS保护网站?
- 6. 当您使用的图书馆不再维护时,您会做什么?
- 7. 何时以及为什么要使用Django开发服务器?
- 8. 何时以及为什么要使用域服务?
- 9. 为什么以及何时使用基于EJB的Web服务?
- 10. 您什么时候可以使用In-Proc WCF组件?
- 11. 当我使用PHP :: SOAP调用Web服务方法时会发生什么?
- 12. 当我们可以使用ExecutorService时,为什么在EJB中使用@Asynchronous?
- 13. 我可以使用什么方法从VBA调用Web服务?
- 14. 为什么使用泛型时,你可以使用类型
- 15. 当您使用数组调用方法removeAllObjects时会发生什么?
- 16. 为什么要使用服务层?
- 17. 为什么在服务中使用onStartCommand()?
- 18. 为什么不使用EXIM OpenDKIM服务?
- 19. 使用什么AWS服务
- 20. 为什么我可以使用XAMPP中的PHP连接到MySQL服务器,但不使用统一服务器?
- 21. 为什么会在Web服务定义中使用RDF?
- 22. 为什么会使用REST而不是基于SOAP的服务?
- 23. 我可以使用什么工具来记录ServiceStack Web服务?
- 24. 我可以使用什么服务来验证支票帐户?
- 25. 什么网络服务和格式可以使用
- 26. 您可以使用泛型与Web服务?
- 27. 您可以使用服务中的LoaderManager吗?
- 28. 您可以在AMP服务器中使用C#库吗?
- 29. 您可以在EC2内使用自定义DNS服务器吗?
- 30. 为什么EJB计时器服务使用Singleton作为标准?
有趣的是,当你提到[报价]活动来来去去,但服务可以留下来,如果你想了[/ quote]。因此,这意味着,如果我打算启用旋转,AsyncTasks应该是因为这样一个事实,当你旋转的活动重新出了问题。对? – 2012-08-06 03:58:42
你可以设置它不被'机器人重新创建:screenOrientation =“肖像”'在AndroidManifest.xml – Lucifer 2012-08-06 04:18:50
请注意,AsyncTasks *不*走开,如果你旋转屏幕,他们将继续执行。如果您想旋转后得到一个处理他们,你可以将它们存储在由Activity.onRetainNonConfigurationInstance返回的Object()。在您的活动重新创建后,您可以从Activity.getLastNonConfigurationInstance()获取此对象。 – cyngus 2012-08-10 21:47:50