Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/365.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中Thread.run()和Handler.post()以及服务之间的区别是什么?_Java_Android_Multithreading_Service_Handler - Fatal编程技术网

Java 什么';Android中Thread.run()和Handler.post()以及服务之间的区别是什么?

Java 什么';Android中Thread.run()和Handler.post()以及服务之间的区别是什么?,java,android,multithreading,service,handler,Java,Android,Multithreading,Service,Handler,当需要在不同线程中执行某些任务时,通常建议在Android中使用Handler.post()。 当我想在后台做一些工作时,有人建议我开始一项服务 但是我觉得使用新线程(newrunnable(){…})更方便和我以前一样 但我担心手动创建新线程在Android中的行为可能会有所不同,比如在内存不足时自动停止,而使用服务时可能不会 希望有一个明确的答案来帮助我摆脱这种困惑。^^ 从UI调用线程违反了单线程模型:Android UI工具包不是线程安全的,必须始终在UI线程上操作。这就是为什么以下是替

当需要在不同线程中执行某些任务时,通常建议在Android中使用
Handler.post()

当我想在后台做一些工作时,有人建议我开始一项
服务

但是我觉得使用
新线程(newrunnable(){…})更方便和我以前一样

但我担心手动创建新线程在Android中的行为可能会有所不同,比如在内存不足时自动停止,而使用
服务时可能不会


希望有一个明确的答案来帮助我摆脱这种困惑。^^

从UI调用线程违反了单线程模型:Android UI工具包不是线程安全的,必须始终在UI线程上操作。这就是为什么以下是替代方法,而不是直接使用线程

  • Activity.runOnUiThread(可运行)
  • View.post(可运行)
  • View.postDelayed(可运行,长)
  • 处理者
处理程序用于UI线程和后台线程之间的通信 AsyncTask用于在后台执行一些小而重的任务

若您在后台有最轻的工作,那个么使用handler进行更重的后台工作,使用AsyncTask并在后台执行最重的工作,使用服务

示例

  • 若要从列表视图中添加或删除数据,处理程序可以使用
  • 要从服务器获取XML数据并在视图中反映这些数据,请使用 AsynTask。异步任务比线程更可取
  • 要播放音乐文件,请使用服务

处理程序用于在特定线程上运行代码片段。到目前为止,最常见的用例是当您处于工作线程上下文中,并且希望在主(UI)线程上运行某些东西时。。。在本例中,您将在主线程上实例化一个处理程序(比如说在初始化期间),并从工作线程向其发送一个Runnable

run()是基本的Java线程入口点。当您需要一个后台线程来执行一些I/O或繁重的计算时,您可以实现这一点,但在Android上通常不需要,因为使用AsyncTask更容易,在AsyncTask中,您可以为工作线程代码重写doInBackground()(即通常实现run()的位置)并重写onPostExecute()在辅助任务完成后,使用要在UI线程上运行的代码


服务完全是另一回事。。。它们不是线。服务代码将与UI一起在主线程上运行。您仍然可以从他们那里使用AsyncTask等,或者使用一种称为IntentService的特殊服务,它将在工作线程上完成工作。

在android中执行某些作业时,强烈建议使用Handler,因为:

在Android中,用户只能在其原始线程(即创建视图的线程)中更新视图,否则应用程序可能会抛出一个异常

android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
Android中的处理程序与创建它们的线程绑定。每个处理程序实例都与一个线程和该线程的消息队列相关联。当您创建一个新的处理程序时,它被绑定到正在创建它的线程的线程/消息队列——从那时起,它将向该消息队列传递消息和可运行文件,并在它们从消息队列中出来时执行它们。因此,在Android中,处理程序是最安全的

而服务,这里有一段代码来自

什么是服务

关于服务类的大多数困惑实际上围绕着它不是什么:

服务不是一个单独的进程。服务对象本身并不意味着它正在自己的进程中运行;除非另有规定,否则它与它所属的应用程序在同一进程中运行

服务不是线程。它本身并不是一种脱离主线程工作的方法(以避免应用程序不响应错误)。 因此,服务本身实际上非常简单,提供了两个主要特性:

应用程序告诉系统它想在后台做什么的工具(即使用户没有直接与应用程序交互)。这对应于对Context.startService()的调用,该调用要求系统安排服务的工作,直到服务或其他人明确停止服务为止

应用程序向其他应用程序公开其某些功能的工具。这对应于对Context.bindService()的调用,该调用允许与服务建立长期连接,以便与服务交互

最后,


线程用于执行一些繁重的非视图功能,一些繁重的计算工作,如解析等,这样它就不会阻塞用户界面并安全地执行所有工作…

谢谢。我发现在PhoneGap内部,它对来自webview的每个请求都使用线程。因此,只使用线程可能是安全和容易的。