为什么在使用服务时会使用AsyncTasks?

时间:2012-08-06 02:58:56

标签: android multithreading asynchronous

当您学习Android开发时,您会了解到如果在ui线程内运行任何类型的过程 - 需要5秒钟的时间,系统将显示臭名昭着的ANR消息。当他们介绍邪恶的怪物时...... AsyncTask。起初你看到这个班级是你的救世主,但是你意识到这是发展中最大的问题......处理轮换或ui事件变得如此成问题,甚至是痛苦的。 你们怎么看待它... AsyncTasks是值得的吗?任何其他方法,无论屏幕旋转如何,执行长时间运行的任务都不会成为问题? 我想你可能会说,嘿,为什么不让它成为一种服务......是的,这是一个解决方案,但接下来让我们回答我真正的问题。为什么我们不使用服务并完全停止使用AsyncTasks ......它们是否有用?

2 个答案:

答案 0 :(得分:2)

在开发过程中,选择适合执行的组件总是好的。您需要清除您的要求,并根据它可以选择ServiceAsyncTask

  • 服务是一种独立于任何其他组件的Android组件。活动可能来去匆匆,但如果您愿意,服务可以随处可见。它们提供多种角色,从管理多个活动所依赖的状态到作为cron作业,再到处理更长的应用程序小部件更新。

  • AsyncTask是一个安排在主应用程序线程上完成一些工作的类。从AsyncTask的实现者和用户来看,它如何执行这一点神奇并不重要。实际上,它使用线程池和工作队列。 AsyncTask使用Handler来帮助安排在主应用程序线程上完成的选择工作(例如,通知用户进度更新)。

有关更多说明,请参阅它们之间的区别。

enter image description here

答案 1 :(得分:0)

AsyncTasks和Services不是同行。要么可以调用另一个,他们的目的是不同的。我只想为Lucifer的回答添加一些内容。

要记住的一件事是,如果你的进程在后台,托管一个服务,并且被杀死,那么该服务将在某个时刻转世。对于可能在被杀死的进程中运行的AsyncTask不是这种情况。这意味着保证在服务中完成的工作将在未来取得进展(尽管不能保证何时)。如果您有必须完成的工作,最好在服务中执行此操作。

调用Service.onStart和Service.onStartCommand发生在进程的主线程上。如果您长时间阻止此操作,您将获得相同的“应用程序无响应”对话框。因此,在服务中使用AsyncTask可以很好地完成实际工作。

我倾向于使用从Activity发起的AsyncTasks来处理与UI相关的事情。这些通常是不需要工作的东西,其工作可以在将来轻松重做。例如,这可能是从磁盘读取一堆图像或调用Web服务以查看用户是否有任何通知。这项工作可以再次完成,如果UI因为进程被终止而被销毁,那么工作可能需要再次完成。

另一方面,如果您希望尽快将一组照片上传到网络,我会将其归结为服务,该服务将使用一个或多个AsyncTasks来执行此操作。这是我想要完成的工作,并且如果被中断则希望恢复。如果您要使用服务,请考虑使用IntentService,以便在其工作完成后停止服务。