Java 什么';Android中Thread.run()和Handler.post()以及服务之间的区别是什么?
当需要在不同线程中执行某些任务时,通常建议在Android中使用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线程上操作。这就是为什么以下是替
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的每个请求都使用线程。因此,只使用线程可能是安全和容易的。