处理程序和接口可运行-具有新线程

时间:2018-09-24 08:30:34

标签: java android multithreading

我已经在堆栈上阅读过此内容:

  

当您使用新的Handler()。post(r)(或Message)时,您添加了   可运行对象传递给Looper并稍后在同一位置执行代码   线程。

此答案被接受。

所以现在我有一个难题,上次采访中的一些人给我提示:如果要在其他线程中运行某些东西并从此新线程UI中进行更新,请使用Handler。

那么Handler是不是新线程?
还是在此线程中可运行在其他线程上工作? 有人可以向我解释吗?

来自官方文档:

  

处理程序有两个主要用途:(1)安排消息和   将来在某个时候执行的可运行对象;和(2)   使要在与您自己的线程不同的线程上执行的操作排队。

3 个答案:

答案 0 :(得分:2)

  • Handler不是新线程。这只是一种计划要在UI线程中完成的任务的机制。
  • 创建/发布到Handler不会创建新线程。
  • 发布到Runnable的{​​{1}}一旦UI线程空闲就在UI线程中运行。

创建Handler实例并将其发布时,其引用将被存储,并且将来的某个时刻将从UI线程调用其Runnable方法。 (您也可以使用方法run指定延迟。)

答案 1 :(得分:1)

HandlerLooper(以及该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线程或其他线程)。

前段时间,我也对此机制感到困惑,收集了一些链接,资源并使用HandlerLooper编写了示例应用程序。您可以在这里进行检查:https://github.com/pwittchen/android-looper-sample。也许您会发现它有用。