54

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

AsyncTask就足够了还是我应该使用IntentService

4

8 回答 8

58

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

AsyncTask是一个方便的线程实用程序,如果您需要不断地告诉用户某些事情或定期在主线程上执行操作,可以使用它。它提供了很多细粒度的控制,并且由于它的性质很容易在其中使用,ActivityIntentService通常需要使用BroadcastReceiverorIBinder框架。

IntentService可以非常像 an 一样使用AsyncTask,但它的目的是用于后台下载、上传或其他不需要用户交互或主线程的阻塞操作。例如,如果您想下载和缓存地图,您可能需要调用 anIntentService以便用户不必查看应用程序即可下载。同样,如果您将数据发送到您的服务器,IntentService则在这方面非常有帮助,因为您可以开始并忘记。例如,用户可以在您的应用中输入评论,然后按“发送”。“发送”将启动IntentService获取评论并将其发送到后台线程上的服务器。用户可以按“发送”并立即离开应用程序,评论最终会,仍然可以到达您的服务器(当然假设没有错误)。如果你这样做AsyncTaskActivity另一方面,系统可能会在交换过程中终止您的进程,并且它可能会或可能不会通过。

一般来说,两者都不适用于长时间运行的应用程序。它们适用于简短的一次性操作。它们可用于永久或长期运行的操作,但不建议这样做。

于 2013-03-01T21:39:53.613 回答
51

您应该使用与AsyncTask活动紧密绑定的简短重复性任务,例如您当前正在尝试做的事情。IntentService更适合应在后台运行的计划任务(重复或不重复),与您的活动无关。

于 2013-03-01T21:33:14.073 回答
22

AsyncTask 不能很好地处理配置更改或其他重启 Activity 的事情。

IntentService 对于应该始终可用的东西很有用,不管它需要多长时间才能完成它的工作。在大多数情况下,我更喜欢 IntentService,因为 AsyncTask 更多地依赖于 Activity 状态。

一些注意事项:

  • AsyncTask适合应该直接返回 UI 的快速任务,但它可以在各种情况下使用。
  • “定期在主线程上执行操作”的说法含糊不清。AsyncTask 生成一个不同于主线程的新后台线程,并在新线程上工作。因此名称为 AsyncTask。
  • IntentService 不需要“操作” BroadcastReceiver 框架。您需要做的就是发送一个本地广播 Intent,并在您的 Activity 中检测它。这是否比 AsyncTask 更难,我不知道。
  • IntentService旨在执行长时间运行的任务,它在后台执行。
  • AsyncTaskLoader 可以使用,但它是 CursorLoader 等的基类。如果您想在用户移动到新位置时刷新“附近”的轨迹,IntentService 可能更好。

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

于 2013-03-01T23:29:45.667 回答
8

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

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

IntentServices 还允许在您的应用程序中进行更模块化的设计。我通常为我的所有 IntentServices 创建一个单独的类,但对于 AsyncTasks 我将它们创建为一个 Activity 内部类。如果要从 Activity 中分离出 AsyncTask,则必须在 AsyncTask 构造函数中传入 Activity Context 和 View 对象,这可能会很混乱。

于 2015-03-22T16:44:18.533 回答
6

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

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

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

于 2013-03-01T22:16:11.050 回答
4

AsyncTask并且IntentService有很多相同的

  • 可以在工作线程中执行任务
  • 可以后台运行
  • 继续运行直到任务完成事件启动它的活动被破坏
  • 可以在任务运行期间或任务完成后通知更新 UI
    • 对于AsyncTask我们经常使用onProgressUpdate的,onPostExecute或者如果你愿意,你可以使用BroadcastReceiver
    • 因为IntentService我们使用BroadcastReceiver

不同的

1) 在运行时或运行完成后发送任务

示例我们的任务是:从基于fileName.

使用 AsyncTask

如果我们的一个实例AsyncTask,在执行下载文件 A 期间,我们无法执行下载文件 B AsyncTask(因为我们得到java.lang.IllegalStateException: Cannot execute task: the task is already running.)。同样在下载文件A完成后,我们不能执行下载文件B(因为我们得到了java.lang.IllegalStateException: Cannot execute task: the task has already been executed (a task can be executed only once)
要在下载文件A期间或之后下载文件B,我们需要创建新的实例AsyncTask
=>要下载文件A和文件B,我们需要2 个AsyncTask=> 2 个工作线程的实例已创建

使用 IntentService

在下载文件 A 期间,我们可以发送下载文件 B 的意图 => 下载文件 A 完成后会自动开始下载文件 B => 不需要新实例,不需要新工作线程。

如果我们在下载文件 A 完成后发送了下载文件 B 的意图?下载文件 A 完成后,IntentSevice将被销毁(因为没有更多的任务)。因此,当开始下载文件 B 时,会创建新的实例Service但没有创建新线程(服务只使用 1 个工作线程,其名称在IntentSevice构造函数中定义

2)实施AsyncTask比实施更容易IntentService

USING
我们会看到AsyncTaskIntentService有很多相同的,所以在大多数情况下我们可以使用AsyncTaskor IntentService。然而

  • 我经常AsyncTask用于一些在 1 中开始、完成、与 UI 交互的任务Activity
  • 我经常IntentService用于一些可以开始/完成和交互或不与任何用户界面交互的任务Activity

这个答案是基于我的测试。如果我错了,请纠正我。希望它有所帮助。

于 2018-03-31T08:39:21.227 回答
0

简而言之,AsyncTask 适用于必须与主线程通信的短任务。IntentService 用于不需要与主线程通信的长任务。

有关更多信息,请查看这些链接

http://www.onsandroid.com/2011/12/difference-between-android.html

https://medium.com/@skidanolegs/asynctask-vs-intentservice-1-example-without-code-5250bea6bdae

https://android.jlelse.eu/using-intentservice-vs-asynctask-in-android-2fec1b853ff4

于 2019-05-21T15:37:24.830 回答
-1

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

但从 Android 3.0 开始,引入了Loaders API ,它应该取代 AsyncTask。因此,例如,对于应该在 Activity 中显示的加载列表,最好使用旨在处理所有配置更改和 Activity 生命周期的 Loader。

Vogella 装载机教程

于 2015-01-21T10:23:51.540 回答