我应该为我的应用程序使用AsyncTask或IntentService吗?

Joh*_* Au 53 android google-maps android-asynctask intentservice

我一直在阅读与Android的互联网连接,并注意到有不同的方法来处理这个AsyncTaskIntentService.但是,我仍然不确定使用哪一个.我的应用程序基本上是一个位置/路径查找器与谷歌地图.我的互联网连接将用于查找地图某个半径范围内最近的路径.因此,每次用户将地图移动或滑动到新位置时,它都会使用最近的路径进行更新.它还将添加新的路径,并允许用户对路径进行评级.

是否AsyncTask足够或我应该使用IntentService

Dee*_*eeV 56

它们可以用于不同目的.

AsyncTask是一个方便的线程实用程序,如果您需要经常告诉用户某些东西或定期在主线程上执行操作,可以使用它.它提供了大量的细粒度控制,并且因为它的性质很容易使用,ActivityIntentService通常需要使用BroadcastReceiverIBinder框架.

IntentService可以非常像一个AsyncTask,但它的目的是用于后台下载,上传或其他不需要用户交互或主线程的阻止操作.例如,如果要下载和缓存地图,您可能需要调用,IntentService以便用户无需查看应用程序即可下载.同样,如果您要将数据发送到服务器,那么IntentService在这方面非常有帮助,因为您可以开始忘记.例如,用户可以在您的应用中键入注释,然后按"发送"."发送"将启动IntentService获取注释并在后台线程上将其发送到您的服务器.用户可以按"发送",并立即离开应用程序和注释会,最终还是到达您的服务器(假定没有当然的错误).如果你有这样做AsyncTask在你的Activity,另一方面,该系统可以杀死你的进程在交换中,它可能有或可能不会去.

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

  • 什么应该用于长期运行的操作比? (4认同)
  • 一个通用的Java Thread,如果它阻塞了.您可以根据需要将其放入活动或服务中.使用生命周期方法控制生命周期,以确保它们在不应该运行时不运行. (2认同)
  • 这意味着与使用回调的Asynctask相比.您不必将BroadcastReceivers用于任何事情,但如果您希望它向活动报告,则这是一种方法.另一种方法是绑定,因为它是正常服务的核心. (2认同)

eba*_*hea 48

您应该使用AsyncTask与活动紧密绑定的简短重复性任务,就像您当前尝试的那样.IntentService更适合应该在后台运行的计划任务(重复或不重复),与您的活动无关.

  • 假设您在应用上保存给定区域的路径(如"收藏夹"或类似内容).如果你想让它们保持最新,那么只需设置一个每天运行的"IntentService"并检查这些区域的变化. (3认同)
  • 差不多,虽然我很确定那些使用推送通知,这完全是另一回事.这就像具有IMAP/POP3的电子邮件应用程序每x分钟检查一次电子邮件. (3认同)

Joe*_*lin 21

AsyncTask不能很好地配置更改或重新启动Activity的其他事情.

IntentService适用于应始终可用的内容,无论执行其工作所需的时间长短.在大多数情况下,我更喜欢IntentService,因为AsyncTask更依赖于Activity状态.

一些说明:

  • AsyncTask 适合快速完成任务,可以直接返回UI,但它可以在各种情况下使用.
  • 声明"定期在主线程上执行操作"是模糊的.AsyncTask生成一个与主线程不同的新后台线程,并在新线程上工作.因此名称为AsyncTask.
  • IntentService不需要"操纵"BroadcastReceiver框架.您需要做的就是发送本地广播Intent,并在您的Activity中检测它.我不知道这是否比AsyncTask更难做.
  • IntentService 为了做长期运行的任务,它在后台运行.
  • AsyncTaskLoader可以使用,但它意味着是CursorLoader等的基类.如果你想在用户移动到新位置时刷新"附近"路径,IntentService可能会更好.

在尝试更新位置之前,请不要忘记检查连接.


Lou*_*rda 8

AsyncTasks与Activity绑定非常紧密,如果您离开创建AsyncTask的Activity,通常会导致泄露的窗口错误.但它们非常适合显示ProgressBar,因为您可以快速更新进度百分比.

IntentServices更清洁,更安全.当你是初学Android开发人员时,它们更难实现,但是一旦你学会了如何启动它们并处理它们,你可能永远不会回到AsyncTasks!

IntentServices还允许在您的应用程序中实现更加模块化的设计.我通常为我的所有IntentServices创建一个单独的类,但对于AsyncTasks,我将它们创建为Activity内部类.如果我要从Activity中分离出AsyncTask,我将不得不传入AsyncTask构造函数中的Activity Context和View对象,这可能很麻烦.


iva*_*rre 6

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

但请记住,这AsyncTask有一个重要的缺点:它不能很好地处理Activity "刷新"(例如在旋转期间).如果用户在AsyncTask仍在装载物品时旋转手机,则可能会出现问题 .如果这确实是你的问题,我建议AsyncTaskLoader:

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