19

在 android 中,Handler 可用于发布/处理消息,如果我不使用 HandlerThread(将其 Looper 传递给 Handler),这是否意味着在这种情况下 Handler 使用 MainThread(UI Thread)的 Looper?

如果 Handler 使用 MainThread 的 Looper 会得到什么结果?可能导致 mainThread 阻塞?

4

6 回答 6

17

如果您想一次执行一项后台任务,并且希望这些任务按执行顺序运行,则可以使用 HandlerThread。

比如你要一个一个地做几个网络后台操作。

是的,HandlerThread 有它自己的循环器,并且可以创建处理程序并将其发布(因此它不会阻塞主线程)。

于 2013-10-12T23:36:52.057 回答
8

像这样使用 HandlerThread 的正常方法:

HandlerThread thread = new HandlerThread("A Handler Thread");
thread.start();
Handler handler = new Handler(thread.getLooper()){
    @Override
    public void handleMessage(Message msg) 
    {
    //....
    }
};

因为HandlerThread可以为Handler创建一个Looper,是一种方便的方式。

当您创建一个新的处理程序时,它会绑定到创建它的线程的线程/消息队列 - 请参阅官方文档...

于 2013-09-17T07:48:49.430 回答
7

如果我不使用 HandlerThread (将其 Looper 传递给 Handler),这是否意味着在这种情况下 Handler 使用 MainThread (UI Thread) 的 Looper ?

查看Handler的文档

Handler ()

默认构造函数将此处理程序与当前线程的 Looper 相关联。

如果你当前的线程是 MainThread,它使用 MainThread(UI Thread) Looper。

要将 Handler 显式关联到您的 MainThread(UI 线程),请编写以下代码。

Handler  mHandler = new Handler(Looper.getMainLooper();

如果你写如下,它使用HandlerThread Looper。

HandlerThread handlerThread = new HandlerThread("HandlerThread");
handlerThread.start();
Handler requestHandler = new Handler(handlerThread.getLooper());

如果Runnable任务中有任何网络 IO 操作,则不能使用 Main thread looper。在这种情况下,发布执行网络 IO 操作HandlerThread的任务很方便。Runnable

你可以找到示例代码@How do I fix android.os.NetworkOnMainThreadException?

如果 Handler 使用 MainThread 的 Looper 会得到什么结果?可能导致 mainThread 阻塞?

如果您向 MainThread Looper 发送许多事件,它们将在 MainThread(UI 线程)本身上执行。如果提交的任务需要更多时间执行,则 MainThread 将被阻塞。

查看下面的帖子了解Looper的内部结构:

Looper 的目的是什么以及如何使用它?

于 2017-02-11T18:12:58.077 回答
6

正如医生所说:

用于启动具有弯针的新线程的便捷类。
然后可以使用 looper 来创建处理程序类。
请注意,仍然必须调用 start()。

HanderThread类继承自Thread类,封装了Looper对象,这样我们就不用关心Looper打开和释放的细节了。就像在普通线程的情况下,我们需要使用Looper.prepare()并将Looper.loop()其转换为LooperThread.

于 2012-05-23T03:21:48.560 回答
3

每个人似乎都解释了它的作用以及它是如何使用的,但是忘记解释这个线程需要在开发人员使用后进行清理,否则它会泄漏。使用后您必须致电

thread.quit()

退出而不处理队列中的消息或

thread.quitSafely();

处理当前在队列中的消息。

于 2019-11-26T19:45:41.947 回答
2

当您想要执行大量后台任务时,HandlerThread 很有用,因为它有自己的循环器。通常,如果您向 Handler 发布消息,它会使用 MainThread 的 looper。这意味着任务在 UI 线程上执行。但是在 HandlerThread 的情况下,这些任务是在工作线程上执行的。你可以在这里找到更详细的解释

于 2016-06-07T14:13:06.903 回答