何时使用Ascyntask以及何时使用Service

时间:2014-04-15 14:28:56

标签: android android-asynctask android-service

我怀疑何时使用AsyncTask以及何时使用Service。截至目前,我了解如果需要GUI更新,则使用AsyncTask服务可以使用Binder使用更复杂的交互,也可以用于与不同流程的交互

2 个答案:

答案 0 :(得分:0)

来自AsyncTask文档 -

  

AsyncTask旨在成为Thread和Handler的辅助类   并不构成通用的线程框架。 AsyncTasks   理想情况下应该用于短期操作(几秒钟的时间)   大多数。)如果你需要保持线程长时间运行,   强烈建议您使用提供的各种API   java.util.concurrent包,如Executor,ThreadPoolExecutor和   FutureTask。

来自服务文档 -

  

服务是表示一个的应用程序组件   应用程序希望执行较长时间运行而不是   与用户交互或为其他人提供功能   要使用的应用程序。

现在谈到OP的问题 -

When to use AsyncTask?

Android实现单线程模型,每当启动Android应用程序时,都会创建一个线程。假设我们在按钮上执行网络操作,请单击我们的应用程序。在按钮上单击,将向服务器发出请求,并等待响应。由于android的单线程模型,等待时间响应,我们的屏幕是无响应的。所以我们应该避免在UI线程上执行长时间运行的操作。这包括文件和网络访问。

为了解决这个问题,我们可以创建新的线程并实现run方法来执行此网络调用,因此UI仍然保持响应。

但是由于Android遵循单线程模型并且Android UI工具包不是线程安全的,因此如果需要根据执行的操作结果对UI进行一些更改,那么这种方法可能会导致一些问题。 / p>

因此Android框架提供了一个非常好的模式,它被包含在AsyncTask中。

When to use Service?

我们可以使用它有两个主要原因 -

  • 当我们需要说Android时我们的应用程序正在做一些事情 背景中的重要事情,不应该被杀死。实现 我们可以通过startForeground方法将Service作为前台运行。
  • 当我们需要向其他人提供我们的应用程序的某些功能时 应用程序。这可以通过在清单文件中导出服​​务来完成 所有。如果您不需要实现其中一个目标 - 您并不需要 服务。

<强>更新

理想情况下,

AsyncTask 应该用于需要几秒钟的操作。有些任务会使线程长时间运行,因此在这种情况下,建议使用java.util.concurrent包,如Executor,ThreadPoolExecutor和FutureTask。

服务更多地用于某个时间间隔内发生的事情,或者在没有显示用户界面的情况下继续运行/检查某事。

答案 1 :(得分:0)

据我所知,AsyncTasks链接到它们启动的Context:例如,如果从Activity启动AsyncTask,然后想要完成此Activity,它将仅在AsyncTask完成时完成。 另一方面,一旦启动服务,它将完成其工作,而不依赖于任何上下文。

我认为当您想要在启动画面期间启动网络作业时,这非常有用,例如,不需要处理您的请求的结束:您将启动您的服务,让它在他身边完成工作, ,另一方面,启动你的活动,而不考虑结果......

服务对于将要重复多次的任务以及您希望在应用程序上下文中继续执行的任务也很有用:例如媒体播放器。