Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/199.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在Android中何时使用线程/服务?_Java_Android_Multithreading_Service - Fatal编程技术网

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

Java 在Android中何时使用线程/服务?,java,android,multithreading,service,Java,Android,Multithreading,Service,什么时候应该使用线程或服务 它们应该用于身份验证吗?例如,在我的应用程序中,我正在考虑使用线程或服务(我正在通过Active Directory进行身份验证) 您是否有每个应用程序将在何时使用的示例?如果您需要其他应用程序使用的或超出您的应用程序活动的内容,请使用服务。服务的一个很好的例子是文件传输,它可能需要很长时间,您不想在这段时间内强制用户使用您的应用程序。在其他情况下使用线程(通常通过AsyncTask或类似方式) 出于身份验证的目的,AsyncTask似乎是一个不错的选择。在长时间运行

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

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


您是否有每个应用程序将在何时使用的示例?

如果您需要其他应用程序使用的或超出您的应用程序活动的内容,请使用服务。服务的一个很好的例子是文件传输,它可能需要很长时间,您不想在这段时间内强制用户使用您的应用程序。在其他情况下使用线程(通常通过AsyncTask或类似方式)


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

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


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

看看这篇漂亮的文章


或者。

更新:Android文档现在似乎包含了相应的说明,请参阅

原始答案:

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

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

服务对象的特殊之处在于它作为一项服务在Android系统中注册。这让系统知道这个对象提供了某种服务,应该尽可能长时间地保持活动状态,或者直到它停止为止。正常的应用程序线程对Android系统没有这种特殊意义,系统会自行决定是否终止线程

因此,如果您只需要在应用程序/
活动
处于活动状态时才需要进行一些后台活动,那么线程可以满足您的需要

如果您需要一个保持活动状态的组件,即使在一段时间后,Android系统决定从内存中删除您的
活动
,该组件也不会被清除,那么您应该使用该服务,甚至是“前台服务”,该服务被系统视为更加重要,甚至不太可能被终止以回收资源

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

编辑:


哦,另外:如果你想为其他应用程序提供一些服务,而这些服务只能“绑定”到某个服务,那么服务当然是一种方法。

我认为主要的区别在于Android系统的态度。服务是安卓基础设施的一部分,所以安卓将服务视为应用程序的工作部分,并将终止服务视为最后的选择。此外,您可以调整服务优先级,以使其与前台活动一样重要。至于线程,android并不认为线程是必须保留的重要部分。所以普通线程被杀死的几率要大得多


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

根据android开发者指南():

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

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


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

服务不在单独的线程上运行,因此它将阻塞UI,
Hmm?服务没有UI。它将阻止哪一个?我猜,您的意思是说来自activity的服务调用将在调用期间阻止activity的UI。也许你应该澄清一下。将阻止操作系统的UI线程,而不仅仅是你的--“这意味着,如果你的服务要执行任何CPU密集型(如MP3播放)或阻止(如网络)操作,它应该生成自己的线程来执行这些操作。”Kafka是正确的。服务在主线程上运行,因此您应该将工作卸载到异步线程或服务内部的类似线程。没有UI并不意味着它没有、可能没有或不会在主线程中运行。你通常可以这样假设,但不总是这样。很抱歉输入错误。。。我的意思很明显!那么为什么还要创建绑定对象而不仅仅是启动对象呢?如果你说这主要是为了一个有效的手术