我对 Android和Android 之间Handlers的区别感到有些困惑。我在 StackOverflow 上阅读了很多博客和问题。AsyncTask``Threads
Handlers
AsyncTask``Threads
Handler是为您提供与 UI 通信的后台线程。例如,更新进度条应该通过Handler. 使用 Handlers 你有优势MessagingQueues,所以如果你想安排消息或更新多个 UI 元素或有重复的任务。
Handler
MessagingQueues
AsyncTask类似,实际上它们都使用Handler,但不在 UI 线程中运行,因此它适用于获取数据,例如获取 Web 服务。稍后您可以与 UI 交互。
AsyncTask
Thread但是无法与 UI 交互,提供更多“基本”线程,并且您错过了AsyncTask.
Thread
但是,我希望在服务中运行一个套接字连接。这应该在处理程序或线程中运行,甚至是AsyncTask? 根本不需要 UI 交互。它对我使用的性能有影响吗?
同时,文档也得到了重大改进。
正如Vogella 网站上关于使用 Handlers、AsyncTask 和 Loaders 进行 Android 后台处理的教程所说:
该类Handler可用于注册到线程并提供一个简单的通道来向该线程发送数据。
该类AsyncTask封装了后台进程的创建以及与主线程的同步。它还支持报告正在运行的任务的进度。
aThread基本上是多线程的核心元素,开发人员可以使用它,但有以下缺点:
如果您使用 Java 线程,您必须在自己的代码中处理以下要求: 如果您将结果回发到用户界面,则与主线程同步 取消线程没有默认值 没有默认线程池 在 Android 中处理配置更改没有默认值
如果您使用 Java 线程,您必须在自己的代码中处理以下要求:
关于AsyncTask,正如Android Developer’s Reference所说:
AsyncTask允许正确和轻松地使用 UI 线程。此类允许在 UI 线程上执行后台操作并发布结果,而无需操作线程和/或处理程序。 AsyncTask被设计为一个帮助类Thread,Handler 并且不构成通用线程框架。AsyncTasks 最适合用于短时间的操作(最多几秒钟)。如果您需要保持线程长时间运行,强烈建议您使用 java.util.concurrent 包提供的各种 API,例如Executor、ThreadPoolExecutor 和 FutureTask。
AsyncTask允许正确和轻松地使用 UI 线程。此类允许在 UI 线程上执行后台操作并发布结果,而无需操作线程和/或处理程序。
AsyncTask被设计为一个帮助类Thread,Handler 并且不构成通用线程框架。AsyncTasks 最适合用于短时间的操作(最多几秒钟)。如果您需要保持线程长时间运行,强烈建议您使用 java.util.concurrent 包提供的各种 API,例如Executor、ThreadPoolExecutor 和 FutureTask。
2015 年 5 月更新: 我找到了涵盖该主题的 一系列精彩讲座。
这是谷歌搜索:Douglas Schmidt 讲座 android 并发和同步 道格拉斯·施密特似乎是一位出色的讲师
这是谷歌搜索:Douglas Schmidt 讲座 android 并发和同步
道格拉斯·施密特似乎是一位出色的讲师
重要提示: 如果您正在考虑使用它AsyncTask来解决线程问题,您应该首先 检查ReactiveX/RxAndroid可能更合适的编程模式。一个很好的概览资源是Learning RxJava 2 for Android by example。
ReactiveX/RxAndroid