服务、线程或异步任务?

6

请原谅我这些问题,因为我对编程还很陌生,所以我并不完全理解主线程、异步任务和服务线程的概念。我正在阅读有关安卓服务的文档,因为我想在主线程之外执行一些任务。文档中说:

如果你需要在主线程之外执行工作,但只在用户与你的应用程序交互时才这样做,那么你可能应该创建一个新的线程而不是一个服务。

1.他们是不是意味着“线程”会在你离开应用程序(例如:按Home键)后立即停止?

例如,如果你想播放一些音乐,但只在你的Activity运行时才这样做,你可以在onCreate()中创建一个线程,在onStart()中开始运行它,然后在onStop()中停止它。也可以考虑使用AsyncTask或HandlerThread,而不是传统的Thread类。有关线程的更多信息,请参阅进程和线程文档。

2.如果线程已经包含在Java中,为什么安卓有AsyncTasks?

请记住,如果您使用服务,默认情况下它仍在应用程序的主线程中运行,因此如果服务执行密集或阻塞操作,则仍应在服务中创建一个新线程。

3.这基本上意味着几乎每个服务都会在其内部创建一个线程,对吗?

4.在服务中启动AsyncTask是否不好?

4个回答

11

1.他们是否说“线程”在您离开应用程序(即主页按钮)后立即停止?

Thread 应该在启动它的 Thread 被销毁时被销毁。因此,如果在 Activity 中启动了一个 Thread,则当该 Activity 被销毁或转移到 Service 时,Thread 应该被销毁。例如,您可以在 Thread 中开始音乐并在那里更新歌曲,但是如果希望在销毁 Activity 时继续播放,则应将其移至 Service

2.如果线程已经集成在 Java 中,为什么 Android 还有 AsyncTask?

AsyncTask 允许您执行后台工作,并通过利用除 doInBackground() 以外任何内置方法来轻松更新 UI 在后台工作完成之前、期间和之后的情况下,因为它是唯一不在 UI Thread 上运行的方法。

3.这基本上是说,几乎每个服务都会在其内部创建一个线程吗?

不一定,但您可以在其中创建一个 Thread

4.在服务内部启动 AsyncTask 是否会有问题?

不会。您可以这样做。

AsyncTask 是进行后台工作的好方法。它的方法使更新 UI 变得非常容易。但是,您需要仔细阅读文档(甚至可能要多次阅读)以确保完全理解如何使用它们。另外,请记住,这些是短暂操作,因此可以用于下载网络数据,但不应用于持续超过几秒钟的操作(根据文档)。


5
  1. 当你离开应用程序时,线程不会立即停止。建议使用单独的线程只是为了不阻塞应用程序的GUI。

  2. 实际上,AsyncTasks在幕后使用线程池,因为创建线程是一项昂贵的过程。如果你有许多短暂的任务,使用AsyncTask只是一种快速、简单但有效的执行它们而不阻塞应用程序GUI的方法。

  3. 是的,本质上是这样的。但是,服务比线程更重量级。不建议使用服务代替线程。另外,服务实际上可以被制成在另一个进程中执行。只是提供信息。

  4. 不。如果你有许多短暂的任务要执行,这将是个好主意。

如果你只是想在主线程之外执行任务,你不需要一个服务。只需创建另一个线程即可。

AsyncTask在幕后只是将你的任务提交到线程池进行执行。如果你有许多短暂的任务,例如解析网络流量,AsyncTask是很好的选择。

然而,如果你处理大量请求,你可能需要更多地控制执行任务的线程池。


你应该明确指出AsyncTask用于完成繁重的任务!这是AsyncTask的主要用途之一。 - Dante
3
不,你只需要在非GUI线程上进行网络操作。由于AsyncTask在非GUI线程上执行,因此它可以被使用,但这并不是唯一的解决方案。@Dante 不,AsyncTask并不一定是用于执行繁重任务的。 - William Morrison
@Keyser 这取决于你对线程池需要多少控制。AsyncTask 只是一种快速访问线程池的方式。如果你想编写一个处理大量流量的应用程序,我建议使用其他方法来控制性能调优,而不是使用 AsyncTask - William Morrison

1
  1. 因为主线程控制UI,而异步任务可以执行更重的任务,同时保持UI不卡顿。

  2. 不需要,但是如果你希望你的服务执行像从互联网加载东西这样的繁重任务,那么它应该使用异步任务。大多数服务用于从互联网加载数据,因此它们中的大多数都具有异步任务。请注意,为了使服务在活动结束后保持活动状态,必须指定它。除非正确配置,否则服务默认会随着活动一起结束。


我的错,刚刚在我的应用程序上重新检查了一下:P - Dante
1
你和我一般都同意,在这里争论没有意义。干得好 +1。 - William Morrison

0
你可能会混淆线程、任务和进程。任务是一种小型进程。进程是在系统中运行的程序,例如当启动任务管理器时,它会显示所有正在运行的进程,如Internet Explorer,但线程是轻量级的小型进程,可以说是执行某些任务的子进程,但在Android中的异步操作与线程类似,但可能会很长。以在Android手机上玩Temple Run为例,如果有人给你打电话,那么高优先级任务将被执行,并且当前线程将被暂停,还有许多方法,如onCreate()、onPause(),你可以理解它们。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接