2013-03-01 153 views
46

我一直在阅读与Android的互联网连接,并注意到有不同的方式来处理,即AsyncTask和IntentService。但是,我仍然不确定使用哪一个。我的应用程序基本上是使用Google地图的位置/路径查找器。我的互联网连接将用于查找地图某个半径内的最近路线。因此,每当用户移动或滑动地图到一个新位置时,它都会用最近的路径进行更新。它还会添加一条新线索,并允许用户对线索进行评分。我应该为我的应用程序使用AsyncTask还是IntentService?

AsyncTask是否可以满足此要求,还是应该使用IntentService?

回答

44

您应该使用AsyncTask来完成与活动紧密结合的短期重复任务,例如您目前正在尝试执行的任务。 IntentService更适合于应该在后台运行的计划任务(重复与否),与您的活动无关。

+0

谢谢你的回答。你能给我一个使用IntentService的例子吗? – 2013-03-01 21:34:13

+3

假设您为应用程序中的给定区域保存了路径(如“收藏夹”或类似内容)。如果您想让它们保持最新,那么只需设置一个每天运行的IntentService,并检查这些区域的变化。 – ebarrenechea 2013-03-01 21:42:08

+0

啊,我明白了。所以我想这就像我们手机上的Facebook或Gmail通知一样? – 2013-03-01 21:44:36

52

他们可以用于不同的目的非常不同。

AsyncTask是一个方便的线程实用程序,可以使用,如果你需要不断告诉用户的东西或定期对主线程执行操作。它提供了大量的细粒度控制,并且由于它的性质非常容易在Activity中使用,而IntentService通常需要使用BroadcastReceiverIBinder框架。

IntentService可以非常类似于AsyncTask,但它的目的是用于后台下载,上传或其他不需要用户交互或主线程的阻塞操作。例如,如果您想下载并缓存地图,则可能需要致电IntentService,以便用户无需查看该应用即可下载。同样,如果您要将数据发送到服务器,则在这方面IntentService非常有用,因为您可以开始并忘记。例如,用户可以在您的应用中输入评论,然后按“发送”。 “发送”将启动IntentService,它将获取评论并在后台线程中将其发送到您的服务器。用户可以按下“发送”并立即离开应用程序,评论最终仍会到达您的服务器(当然假设没有错误)。如果您在ActivityActivity中执行AsyncTask,系统可能会在交换过程中关闭流程,并且可能会或可能无法通过。

一般来说,这两个都不适用于长时间运行的应用程序。它们意味着短暂的一次性操作。它们可以用于永久性或长时间运行的操作,但不建议。

+3

长时间运行的操作应使用什么比? – roiberg 2013-03-20 13:41:02

+2

通用Java线程如果阻塞。您可以根据需要将其放入活动或服务中。使用生命周期方法控制生命周期,以确保它们在不应该运行时不会运行。 – DeeV 2013-03-20 13:45:25

+0

-1:'... IntentService通常需要操作BroadcastReceiver框架。“不,它不。请参阅@Joe Malin的回答:http://stackoverflow.com/a/15168625/109941? – 2014-03-08 19:56:23

6

如上所述AsyncTask将解决您的问题。

但请记住AsyncTask有一个重要的弱点:它不能很好地处理“刷新”(例如在旋转期间)。例如,如果用户在您的AsyncTask仍在加载内容的情况下旋转手机,则可能会出现问题。如果这确实是你的问题,我建议AsyncTaskLoader

http://developer.android.com/reference/android/content/AsyncTaskLoader.html

+0

感谢您的加入 – 2013-03-02 00:13:18

21

的AsyncTask不配置更改或重新启动活动的其他东西玩好。

IntentService对于某些应该始终可用的内容非常有用,无论其工作需要多长时间。我更喜欢IntentService,因为AsyncTask更依赖于Activity状态。

一些注意事项:

  • 的AsyncTask是快速的任务应该向右走回到UI 最好,但它可以在各种情况下使用。
  • 声明“定期对主线程执行操作”含糊不清。 AsyncTask产生一个新的后台线程不同于的主线程,并且在新线程上工作。因此名称AsyncTask。
  • 的IntentService并不需要“操纵”的广播接收器架构。所有你需要做的就是发送一个本地广播Intent,并在你的Activity中检测它。这是否比AsyncTask更难做到,我不知道。
  • IntentService 意思做长时间运行的任务,它在后台运行。
  • AsyncTaskLoader可以使用,但它的目的是作为CursorLoader的基类等。 如果你想在用户移动到新位置时刷新“附近”路径,IntentService可能会更好。

不要忘记尝试更新位置信息之前检查连接。

-1

我同意@DeeV和@ebarrenechea关于Intent服务的部分内容,您应该将它用于与Activity不紧密绑定的任务,如将某些数据上传到服务器或将数据从服务器存储到数据库。

但是从Android 3.0的首发中引入Loaders API哪些应该更换的AsyncTask。因此,例如对于您应该在Activity中显示的加载列表,最好使用Loader,它可以很好地处理所有配置更改和活动生命周期。

Vogella loader tutorial

+0

您确定Loader应该用于服务器工作吗?我从来没有听说过,我没有看到任何文档或教程链接到这个建议。 – 2016-01-22 10:27:45

8

AsyncTasks非常紧密的结合到Activitys,如果浏览从创建的AsyncTask的活动远常可引起泄漏窗口的错误。但他们非常适合展示ProgressBar,因为您可以快速更新进度百分比。

IntentServices清洁和安全。当你是初学者的Android开发者时,他们更难以实现,但是一旦你学会了如何开始他们并处理他们,你可能永远不会回到AsyncTasks!

IntentServices还允许在你的应用程序更加模块化的设计。我通常为我所有的IntentServices创建一个单独的类,但对于AsyncTasks,我将它们创建为一个Activity内部类。如果我要从活动中分离出一个AsyncTask,我必须在AsyncTask构造函数中传入活动上下文和视图对象,这可能很麻烦。

+0

为了克服这个混乱的问题,你不能为你的AsyncTask类添加一个内部接口。该接口将包含活动实现的回调方法? – 2016-01-22 10:15:22

相关问题