我应该使用AsyncTask还是IntentService?
我一直在阅读与Android的互联网连接,并注意到有不同的方式来处理这个,即AsyncTask和IntentService。 不过,我仍然不确定使用哪一个。 我的应用程序基本上是一个谷歌地图的位置/path查找器。 我的互联网连接将用于在地图的特定半径内查找最近的路线。 所以,每当用户移动或滑动地图到一个新的位置,那么它将更新与最近的path。 它也将添加一个新的线索,并允许用户评分线索。
将AsyncTask足够这个或我应该使用IntentService?
您应该使用AsyncTask
来完成与活动紧密结合的短期重复性任务,例如您目前正在尝试执行的任务。 IntentService
更适合于应该在后台运行的计划任务(重复或不重复),与您的活动无关。
他们可以用于不同的目的非常不同。
AsyncTask
是一个方便的线程实用程序,如果您需要不断地告诉用户某些东西或定期在主线程上执行操作,可以使用它。 它提供了很多的细粒度控制,而且由于它的本质在Activity
很容易处理,而IntentService
通常需要使用BroadcastReceiver
或者IBinder
框架。
IntentService
可以像AsyncTask
一样使用,但是它的目的是为了后台下载,上传,或者其他不需要用户交互或主线程的阻塞操作。 例如,如果您想要下载和caching地图,则可能需要调用IntentService
以便用户无需查看应用程序即可进行下载。 同样,如果您将数据发送到您的服务器, IntentService
在这方面非常有用,因为您可以开始并忘记。 用户可以说,在您的应用程序中键入评论,然后按“发送”。 “发送”将启动IntentService
获取评论,并在后台线程发送到您的服务器。 用户可以按“发送”,并立即离开应用程序,评论将最终仍然到达您的服务器(当然假设没有错误)。 如果你在Activity
使用了AsyncTask
,那么系统可能会在交换过程中杀掉你的进程,并且可能会或者可能不会通过。
一般来说,对于长时间运行的应用程序, 它们意味着短暂的一次性操作。 他们可以用于永久或长时间的行动,但不build议。
AsyncTask在configuration更改或其他重新启动活动时不能很好地运行。
IntentService对于一个应该始终可用的东西是有好处的,无论其工作需要多长时间。 我更喜欢IntentService,因为AsyncTask更依赖于Activity的状态。
一些说明:
- AsyncTask 最适合于应该直接回到UI的快速任务,但可以在各种情况下使用。
- 声明“定期对主线执行操作”含糊不清。 AsyncTask产生一个新的后台线程,这是不同于主线程,并在新线程上工作。 因此名称AsyncTask。
- IntentService不需要“操纵”BroadcastReceiver框架。 所有你需要做的就是发送一个本地广播意图,并在你的活动中检测到它。 这是否比AsyncTask更难做,我不知道。
- IntentService 是为了执行长时间运行的任务,它在后台执行。
- AsyncTaskLoader是可以使用的,但它是CursorLoader的基类,等等。如果你想在用户移动到新位置时刷新“附近”的path,IntentService可能会更好。
在尝试更新位置之前,不要忘记检查连接性。
AsyncTasks与Activity紧密相连,如果远离创buildAsyncTask的Activity,则通常会导致泄漏的窗口错误。 但是,由于可以快速更新进度百分比,因此它们显示ProgressBar非常棒。
意向服务更清洁,更安全。 当你是初学者的Android开发者时,他们更难以实现,但是一旦你学会了如何开始他们并处理他们,你将永远不会回到AsyncTasks!
意图服务还允许在您的应用程序更模块化的devise。 我通常为我所有的IntentServices创build一个单独的类,但对于AsyncTasks,我将它们创build为一个Activity内部类。 如果我从一个Activity中分离出一个AsyncTask,我将不得不在AsyncTask的构造函数中传入活动上下文和视图对象。
如上所述, AsyncTask
将解决您的问题。
但请记住, AsyncTask
有一个重要的弱点:它不能很好地处理Activity
“刷新”(例如在轮换期间)。 这可能是一个问题,例如,如果您的AsyncTask
仍在加载内容的用户旋转手机。 如果这确实是你的问题,我推荐AsyncTaskLoader
:
http://developer.android.com/reference/android/content/AsyncTaskLoader.html
我同意@DeeV和@ebarrenechea关于Intent服务的一部分,您应该将它用于与Activity不紧密绑定的任务,如将一些数据上传到服务器或将数据从服务器存储到数据库。
但从Android 3.0开始,引入了Loaders API,它应该替代AsyncTask。 因此,例如对于您应该显示在Activity中的加载列表,最好使用专门用于处理所有configuration更改和活动生命周期的Loader。
沃格拉装载机教程