小编典典

处理程序 vs AsyncTask vs 线程

all

我对 Android和Android 之间Handlers的区别感到有些困惑。我在 StackOverflow
上阅读了很多博客和问题。AsyncTask``Threads

Handler是为您提供与 UI 通信的后台线程。例如,更新进度条应该通过Handler. 使用 Handlers
你有优势MessagingQueues,所以如果你想安排消息或更新多个 UI 元素或有重复的任务。

AsyncTask类似,实际上它们都使用Handler,但不在 UI 线程中运行,因此它适用于获取数据,例如获取 Web 服务。稍后您可以与 UI
交互。

Thread但是无法与 UI 交互,提供更多“基本”线程,并且您错过了AsyncTask.

但是,我希望在服务中运行一个套接字连接。这应该在处理程序或线程中运行,甚至是AsyncTask? 根本不需要 UI 交互。它对我使用的性能有影响吗?

同时,文档也得到了重大改进。


阅读 100

收藏
2022-03-23

共1个答案

小编典典

正如Vogella 网站上关于使用 Handlers、AsyncTask 和 Loaders 进行 Android
后台处理
的教程所说:

该类Handler可用于注册到线程并提供一个简单的通道来向该线程发送数据。

该类AsyncTask封装了后台进程的创建以及与主线程的同步。它还支持报告正在运行的任务的进度。

aThread基本上是多线程的核心元素,开发人员可以使用它,但有以下缺点:

如果您使用 Java 线程,您必须在自己的代码中处理以下要求:

  • 如果您将结果回发到用户界面,则与主线程同步
  • 取消线程没有默认值
  • 没有默认线程池
  • 在 Android 中处理配置更改没有默认值

关于AsyncTask,正如Android Developer’s
Reference
所说:

AsyncTask允许正确和轻松地使用 UI 线程。此类允许在 UI 线程上执行后台操作并发布结果,而无需操作线程和/或处理程序。

AsyncTask被设计为一个帮助类ThreadHandler 并且不构成通用线程框架。AsyncTasks
最适合用于短时间的操作(最多几秒钟)。如果您需要保持线程长时间运行,强烈建议您使用 java.util.concurrent 包提供的各种
API,例如Executor、ThreadPoolExecutor 和 FutureTask。

2015 年 5 月更新: 我找到了涵盖该主题的 一系列精彩讲座。

这是谷歌搜索:Douglas Schmidt 讲座 android
并发和同步

道格拉斯·施密特似乎是一位出色的讲师

重要提示: 如果您正在考虑使用它AsyncTask来解决线程问题,您应该首先
检查ReactiveX/RxAndroid可能更合适的编程模式。一个很好的概览资源是Learning RxJava 2 for
Android by example

2022-03-23