【问题标题】:When to use Ascyntask and when to you use Service何时使用 Ascyntask 以及何时使用 Service
【发布时间】:2014-04-15 14:28:55
【问题描述】:

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

【问题讨论】:

  • Asynctask 旨在处理您希望在后台运行的网络请求,而不是让您的 UI 线程变黑。另一方面,服务是针对您想要完成的工作而无需频繁的用户交互(例如播放歌曲)

标签: android android-asynctask android-service


【解决方案1】:

据我所知,AsyncTask 与它们启动的上下文相关联:例如,如果您从 Activity 启动 AsyncTask,然后想要完成此 Activity,它只会在 AsyncTask 完成时完成。 另一方面,一旦服务启动,它将完成它的工作,而不依赖于任何上下文。

我认为这在您想在启动画面期间启动网络作业时很有用,例如,不考虑请求的结束:您将启动您的服务,让它在他身边完成它的工作,然后,另一方面,启动您的活动,而不关心结果...

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

【讨论】:

  • AsyncTaask 将用于活动或片段中,以在不冻结 UI 的情况下完成繁重的工作。服务将在其自己的线程中工作,并在其生命周期内进行您想要的任何工作:播放音乐,每 XX 秒刷新一些数据......
【解决方案2】:

来自 AsyncTask 文档 -

AsyncTask 被设计成一个围绕 Thread 和 Handler 的辅助类 并且不构成通用线程框架。异步任务 理想情况下应用于短操作(几秒钟在 大多数。)如果您需要保持线程长时间运行, 强烈建议您使用由 java.util.concurrent 包,例如 Executor、ThreadPoolExecutor 和 未来任务。

来自服务文档 -

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

现在来看看 OP 的要求——

When to use AsyncTask?

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

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

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

所以 Android 框架提供了一个非常好的模式,它被封装在 AsyncTask 中。

When to use Service?

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

  • 当我们需要告诉 Android 我们的应用程序正在执行某些操作时 重要的事情在后台,不应该被杀死。达到 这样我们就可以通过 startForeground 方法将 Service 作为前台运行。
  • 当我们需要将我们的应用程序的某些功能提供给其他应用程序时 应用程序。这可以通过在清单文件中导出服​​务来完成 全部。如果您不需要实现这些目标之一 - 您不需要 完全服务。

更新:

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

服务更多地用于应该在间隔内发生的事情,或者在没有显示 UI 时继续运行/检查某些事情。

【讨论】:

  • 这是 android 教程中的内容。请说明您将在什么情况下编写 Ascyntask 以及您将在什么情况下使用服务都可以在 baground 中工作
猜你喜欢
  • 2012-03-13
  • 2015-01-07
  • 2016-09-23
  • 2021-02-09
  • 2019-08-12
  • 1970-01-01
  • 2020-01-11
  • 2011-01-18
相关资源
最近更新 更多