2012-08-06 73 views
1

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

回答

2

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

  • 服务是一个独立于任何其他组件生活的Android组件。活动可能会来来去去,但如果您愿意,服务可以坚持下去。他们担任多种角色,从管理多个活动依赖的状态到用作cron作业,以处理更长的应用部件更新。

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

欲了解更多信息,请参阅它们之间的区别。

enter image description here

+0

有趣的是,当你提到[报价]活动来来去去,但服务可以留下来,如果你想了[/ quote]。因此,这意味着,如果我打算启用旋转,AsyncTasks应该是因为这样一个事实,当你旋转的活动重新出了问题。对? – 2012-08-06 03:58:42

+0

你可以设置它不被'机器人重新创建:screenOrientation =“肖像”'在AndroidManifest.xml – Lucifer 2012-08-06 04:18:50

+0

请注意,AsyncTasks *不*走开,如果你旋转屏幕,他们将继续执行。如果您想旋转后得到一个处理他们,你可以将它们存储在由Activity.onRetainNonConfigurationInstance返回的Object()。在您的活动重新创建后,您可以从Activity.getLastNonConfigurationInstance()获取此对象。 – cyngus 2012-08-10 21:47:50

0

AsyncTasks和服务是不相称的。要么可能调用另一个,他们的目的是不同的。我只有几件事情可以添加到路西法的答案中。

要记住的一个关键是,如果你的进程在后台,主持一个服务,并被杀死,该服务将在某个时刻转世。当一个AsyncTask被杀死时,它可能在一个进程中运行,情况并非如此。这意味着在服务中完成的工作将保证在未来取得进展(尽管在何时不能保证)。如果您的工作必须完成,最好在服务中完成。

调用Service.onStart和Service.onStartCommand发生在进程的主线程中。如果您很长时间阻止了此操作,则会收到相同的“应用程序无响应”对话框。因此,一个AsyncTask在服务内部使用来做真正的工作是一件好事。

我倾向于使用从Activity启动的AsyncTasks来处理与UI相关的事物。这些往往是不需要工作的东西,而且他们的工作在未来很容易重做。例如,这可能是从磁盘读取一堆图像,或者调用Web服务来查看用户是否有任何通知。这项工作可以再次完成,如果因为进程被终止而被销毁,那么工作可能需要再次完成。

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

相关问题