服务或线程或AsyncTask

时间:2013-07-30 18:13:50

标签: java android android-asynctask android-service

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

  

如果您需要在主线程之外执行工作,但仅限于   用户正在与您的应用程序进行交互,那么您应该   可能改为创建一个新线程而不是服务。

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

  

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

2.如果线程被编入Java,为什么android有AsyncTasks?

  

请记住,如果您使用某项服务,它仍会在您的服务中运行   默认情况下,应用程序的主线程,所以你仍然应该创建一个新的   服务中的线程,如果它执行密集或阻塞   操作

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

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

4 个答案:

答案 0 :(得分:10)

  

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

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

  

2.如果线程被编入Java,为什么android有AsyncTasks?

AsyncTask允许您执行后台工作,并在使用除{{1}之外的任何内置方法完成后台工作之前,期间和之后轻松更新UI因为它是{em>不在doInBackground()

上运行的唯一一个
  

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

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

  

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

没有。你可以这样做。

AsyncTask是进行后台工作的好方法。它的方法可以很容易地更新Thread。但是您需要仔细阅读文档(可能甚至几次)以确保您完全了解如何使用它们。此外,请记住这些是短期操作,因此它们可以很好地下载网络数据,但不应该用于持续时间超过几秒的事情(根据文档)

答案 1 :(得分:5)

  1. 离开应用程序时,线程不会立即停止。建议使用单独的线程,这样才不会阻止应用程序的GUI。

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

  3. 是的,基本上。虽然服务比线程更重。使用服务代替线程不是一个好主意。实际上,服务也可以在整个其他进程上执行。仅供参考。

  4. 没有。如果您要执行许多短期任务,那将是一个好主意。

  5. 如果您只是尝试从主线程执行任务,则不需要服务。只需创建另一个线程。

    幕后的

    AsyncTask只需将您的任务提交给线程池执行即可。如果您有许多短期任务,例如解析网络流量,AsyncTask很棒。

    但是,如果您正在处理大量请求,则可能需要更多地控制执行任务的线程池。

答案 2 :(得分:1)

  1. 没有

  2. 因为主线程控制UI,而asynctasks可以在保持UI无滞后的同时执行更重的任务。

  3. 不,但如果你想让你的服务像从互联网上加载东西一样繁重,那么就应该使用asynctask。大多数服务用于从互联网加载数据,因此大多数服务都具有asynctasks。请注意,要使活动在活动消失后保持活动,您必须指定它。除非正确配置,否则默认情况下服务会与活动一起消失

  4. 没有

答案 3 :(得分:0)

你可能会因为线程,任务和进程而感到困惑。任务是一种小过程。一个过程 是一个在你的系统示例中运行的程序,在启动你的任务管理器时它显示所有正在运行的进程,如Internet-explorer但是线程是小的轻量级进程意味着你可以说在执行中执行某些任务但是异步的子进程在android中只是类似于线程,但它可能很长。在android中你举一个例子在android-phone中运行temple-run,并且有一个人正在调用你,以便执行高优先级任务并暂停当前线程那里有很多方法 比如onCreate(),onPause(),你可以理解它。