java - Thread.run() 和 Handler.post() 和 Android 中的 Service 有什么区别?

标签 java android multithreading service handler

当需要在不同的线程中做一些工作时,一般建议在Android中使用Handler.post()
当我想在后台做一些工作时,我被建议启动一个服务

但我觉得像以前一样使用 new Thread (new Runnable(){...} ); 更方便。

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

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

最佳答案

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

在 Android 中,只能在其原始线程中更新 View ,即创建它们的线程,否则应用程序可能会抛出异常

android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.

Android 中的处理程序与创建它们的线程绑定(bind)。每个 Handler 实例都与一个线程和该线程的消息队列相关联。当您创建一个新的处理程序时,它会绑定(bind)到创建它的线程的线程/消息队列——从那时起,它将消息和可运行对象传递到该消息队列并在它们从消息中出来时执行它们队列。因此,处理程序在 Android 中是最安全的。

在服务时,这是来自 http://developer.android.com/reference/android/app/Service.html 的一段代码

什么是服务?

关于 Service 类的大多数混淆实际上围绕着它不是什么:

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

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

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

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

最后是线程,

线程用于执行一些繁重的非 View 功能,一些繁重的计算工作,如解析等,这样它就不会阻塞你的 UI 并安全地执行所有工作......

关于java - Thread.run() 和 Handler.post() 和 Android 中的 Service 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8678616/

相关文章:

Android Intent ACTION.SEND——无法向 Twitter 或 Facebook 发送文本

java - 学习android-创建一个类并稍作修改以重用代码-sdk

java - 从 executorservice 请求新任务的线程

c# - 优雅地关闭多线程应用程序?

java - 多范围随机数生成器

java - 将数据存储在动态二维数组中

java - 可以从公共(public)使用中删除 Maven 依赖项吗?

java - Hibernate JPA create table type=InnoDB 问题

android - 每 5 秒用字符串数组中的每个字符串更新 TextView

java - Play2 长期套接字连接和多线程