何时在Android中使用线程/服务?

时间:2011-10-28 18:14:57

标签: java android multithreading service

什么时候应该使用线程或服务?

它们应该用于身份验证吗?例如,在我的应用程序中,我正在考虑使用线程或服务(我通过Active Directory进行身份验证。)

您是否有使用每种方法的例子?

6 个答案:

答案 0 :(得分:47)

更新:Android文档似乎现在包含相应的说明,请参阅http://developer.android.com/reference/android/app/Service.html#WhatIsAService

原始回答:

在Android中,Service不提供任何并发执行(“在后台运行”)。它实际上更像是一个简单的Java对象,它只是通过Android系统而不是你的应用程序通过new实例化(和管理)。

因此,服务最重要的属性不是延迟工作量;这可以通过简单的线程来实现。

使服务对象与众不同的是它在Android系统中注册为服务。这让系统知道这个对象提供某种服务,并且应该尽可能长时间保持活动,或直到它停止。普通应用程序线程对Android系统没有这种特殊含义,并且系统可以自行决定更加慷慨地终止。

因此,如果您只需要在应用程序/ Activity处于活动状态时继续执行某些后台活动,则线程可以执行您所需的操作。

如果你需要一个保持活动的组件,即使在一段时间之后,Android系统决定从内存中删除你的Activities,你也不会被清除,甚至是“前台服务”,被系统认为更为重要,甚至不太可能被终止以收回资源。

当然,如果需要,还可以使Service个对象包含一个或多个Thread实例,这些实例可以与Service对象本身一样长。

编辑:

哦,加上:如果你想向其他应用程序提供一些服务,那么服务就是 的方式,这些服务只能“绑定”到服务上。 / p>

答案 1 :(得分:26)

应该在长时间运行的进程中使用一个线程来阻止UI更新。如果它超过一两秒,您可能希望将其放入后台线程并通过对话框或微调器等通知用户。如果您锁定UI线程超过5秒,操作系统将提示用户选择“终止或等待”选项。

服务不在单独的线程上运行,因此它将阻止UI,但您可以在服务中生成新线程。服务更多地用于某个时间间隔内发生的事情,或者在没有显示UI的情况下继续运行/检查某些内容。

答案 2 :(得分:4)

答案 3 :(得分:3)

如果您需要其他应用程序使用或比您的应用程序活动更长的内容,请使用服务。服务的一个好例子是文件传输可能需要很长时间,并且您不希望在此期间强制用户使用您的应用程序。在其他情况下使用线程(通常通过AsyncTask或类似方法)。

出于身份验证的目的,AsyncTask似乎是一个不错的选择。

答案 4 :(得分:1)

我认为主要区别在于Android系统的态度。服务是android基础架构的一部分,因此android将服务视为应用程序的工作部分,并将杀死服务视为最后一个选项。此外,您可以调整服务优先级,以便像前台活动一样重要。至于线程,android不会将线程识别为必须保留的重要部分。因此,通常的线程有更多的机会被杀死。

例如,如果你有一个活动启动一个工作线程然后去后台,因为android不认为线程是一个工作部分,它可能认为应用程序什么也不做,因为没有活动或服务运行并杀死整个应用程序,包括工作线程。

答案 5 :(得分:1)

根据Android开发人员指南(http://developer.android.com/guide/components/services.html#Basics):

即使用户没有与您的应用程序交互,服务也只是一个可以在后台运行的组件。因此,只有在您需要的时候才应创建服务。

如果您需要在主线程之外执行工作,但只有在用户与您的应用程序交互时,您应该创建一个新线程而不是服务。例如,如果您想播放一些音乐,但只有在您的活动正在运行时,您可以在onCreate()中创建一个线程,在onStart()中开始运行它,然后在onStop()中停止它。还要考虑使用AsyncTask或HandlerThread,而不是传统的Thread类。有关线程的更多信息,请参阅进程和线程文档。

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