我已经在堆栈上阅读过此内容:
当您使用新的Handler()。post(r)(或Message)时,您添加了 可运行对象传递给Looper并稍后在同一位置执行代码 线程。
此答案被接受。
所以现在我有一个难题,上次采访中的一些人给我提示:如果要在其他线程中运行某些东西并从此新线程UI中进行更新,请使用Handler。
那么Handler是不是新线程?
还是在此线程中可运行在其他线程上工作?
有人可以向我解释吗?
来自官方文档:
处理程序有两个主要用途:(1)安排消息和 将来在某个时候执行的可运行对象;和(2) 使要在与您自己的线程不同的线程上执行的操作排队。
答案 0 :(得分:2)
Handler
不是新线程。这只是一种计划要在UI线程中完成的任务的机制。Handler
不会创建新线程。Runnable
的{{1}}一旦UI线程空闲就在UI线程中运行。创建Handler
实例并将其发布时,其引用将被存储,并且将来的某个时刻将从UI线程调用其Runnable
方法。 (您也可以使用方法run
指定延迟。)
答案 1 :(得分:1)
Handler
与Looper
(以及该Looper
的线程)相关联。调用new Handler()
创建新的处理程序时,您会将其与当前线程(运行当前代码的线程)的Looper
关联。
有了这个对象后,就可以在另一个线程中使用它来报告结果,等等。
例如,从后台线程,您可以在与UI线程关联的处理程序对象上调用post()
。当处理程序到达时,您通过的Runnable
将由该处理程序在其线程中执行(而不是在调用post()
函数的线程中)。
有关循环播放器和处理程序的其他信息/详细信息,请参见https://developer.android.com/training/multiple-threads/communicate-ui
答案 2 :(得分:1)
这是Android documentation的报价单:
处理程序使您可以发送和处理与线程的MessageQueue相关的Message和Runnable对象。每个Handler实例都与一个线程和该线程的消息队列关联。创建新的Handler时,它将绑定到正在创建它的线程的线程/消息队列中-从那时起,它将把消息和可运行对象传递到该消息队列,并在它们从消息中出来时执行它们队列。
处理程序有两个主要用途:(1)计划消息和可运行对象在将来的某个时刻执行; (2)使要在与您自己的线程不同的线程上执行的操作排队。
这部分非常重要:
创建新的处理程序时,它会绑定到正在创建它的线程的线程/消息队列中
Handler
不是一个新线程,当您将新的Runnable传递到Looper
线程进行处理时,它可以处理队列中的消息。当您显式地执行每个消息时,可以在单独的线程或线程池中对其进行处理。否则,它将在创建Looper
的线程中进行处理(可以是主/ UI线程或其他线程)。
前段时间,我也对此机制感到困惑,收集了一些链接,资源并使用Handler
和Looper
编写了示例应用程序。您可以在这里进行检查:https://github.com/pwittchen/android-looper-sample。也许您会发现它有用。