为什么在Android中使用HandlerThread

Dan*_*iel 15 android android-handler android-handlerthread

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

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

ozn*_*nus 16

如果要一次执行一个后台任务,并且希望这些任务按执行顺序运行,则可以使用HandlerThread.

例如,如果您想逐个进行多个网络后台操作.

是的,HandlerThread有它自己的looper并且可以创建并发布处理程序(因此它不会阻止主线程).


Rav*_*abu 7

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

查看Handler 的文档

Handler ()
Run Code Online (Sandbox Code Playgroud)

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

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

要将处理程序显式关联到您的主线程(UI 线程),请编写以下代码。

Handler  mHandler = new Handler(Looper.getMainLooper();
Run Code Online (Sandbox Code Playgroud)

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

HandlerThread handlerThread = new HandlerThread("HandlerThread");
handlerThread.start();
Handler requestHandler = new Handler(handlerThread.getLooper());
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

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


Ric*_*ard 6

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

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

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

当你创建一个新的Handler时,它被绑定到创建它的线程的线程/消息队列 - 请参阅官方文档...


ρяσ*_*я K 5

正如Doc所说:

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

HanderThread该类继承自Thread类,该类封装了Looper对象,因此我们不必关心Looper的打开和释放详细信息。就像普通线程一样,我们需要使用Looper.prepare()并将Looper.loop()其转换为LooperThread