如果我们查看源代码,我们会看到AsyncTask
它Handler
是纯粹用 Java 编写的。(不过也有一些例外。但这不是重点)
AsyncTask
所以or没有魔法Handler
。这些课程使我们作为开发人员的生活更轻松。
例如:如果程序 A 调用方法 A(),则方法 A() 可以与程序 A 在不同的线程中运行。我们可以通过以下代码轻松验证:
Thread t = Thread.currentThread();
int id = t.getId();
为什么我们要为某些任务使用新线程?你可以google一下。很多很多原因,例如:举重,长时间运行的工作。
Thread
那么,AsyncTask
、 和之间有什么区别Handler
?
AsyncTask
andHandler
是用 Java 编写的(在内部他们使用 a Thread
),所以我们可以用Handler
or做的所有事情AsyncTask
,我们也可以使用 a 来实现Thread
。
什么可以Handler
而且AsyncTask
真正有帮助?
最明显的原因是调用者线程和工作线程之间的通信。(调用者线程:调用工作线程以执行某些任务的线程。调用者线程不一定是 UI 线程)。当然,我们可以通过其他方式在两个线程之间进行通信,但是由于线程安全,存在许多缺点(和危险)。
这就是我们应该使用Handler
and的原因AsyncTask
。这些类为我们完成了大部分工作,我们只需要知道要覆盖哪些方法。
Handler
和之间的区别AsyncTask
是:AsyncTask
当Caller 线程是UI Thread时使用。这是android文档所说的:
AsyncTask 允许正确和轻松地使用 UI 线程。此类允许在 UI 线程上执行后台操作并发布结果,而无需操作线程和/或处理程序
我想强调两点:
1)UI线程的易用性(所以,当调用者线程是UI线程时使用)。
2)无需操纵处理程序。(意味着:您可以使用 Handler 代替 AsyncTask,但 AsyncTask 是一个更简单的选择)。
这篇文章中有很多东西我还没有说,例如:什么是 UI Thread,或者为什么它更容易。你必须知道每个类背后的一些方法并使用它,你就会完全理解其中的原因。
@:当你阅读Android文档时,你会看到:
Handler 允许您发送和处理与线程的 MessageQueue 关联的 Message 和 Runnable 对象
这个描述起初可能看起来很奇怪。我们只需要了解每个线程都有各自的消息队列(就像一个待办事项列表),线程会拿走每条消息,一直执行到消息队列为空(就像我们完成工作上床睡觉一样)。所以,当Handler
通信时,它只是给调用者线程一个消息,它会等待处理。
复杂?请记住,Handler
可以安全地与调用者线程通信。