为什么在Android中使用HandlerThread?

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

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

Solutions Collecting From Web of "为什么在Android中使用HandlerThread?"

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

例如,如果你想一个一个地做几个networking后台操作。

是的,HandlerThread有它自己的循环,可以创build并发布处理程序(所以它不会阻塞主线程)。

正如Doc所说:

方便的类开始一个新的线程,有一个活套。
这个循环可以用来创build处理程序类。
请注意,start()仍然必须被调用。

HanderThread类inheritance了Thread类,它封装了Looper对象,所以我们不关心Looper的打开和释放细节。 就像普通的线程一样,我们需要使用Looper.prepare()Looper.loop()来将它转换为LooperThread

正常的使用HandlerThread的方式是这样的:

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

由于HandlerThread可以为Handler创build一个Looper,这是一种方便的方式。

当您创build一个新的处理程序时,它将绑定到正在创build它的线程的线程/消息队列 – 请参阅官方文档…

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

看看Handler的文档

 Handler () 

默认的构造函数将这个处理程序与当前线程的Looper关联起来。

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

要明确地把Handler和你的MainThread(UI Thread)联系起来,写下面的代码。

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

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

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

如果在Runnable任务中有任何networkingIO操作,则不能使用主线程活套。 在这种情况下, HandlerThread发布执行networkingIO操作的Runnable任务。

你可以find示例代码@ 如何修复android.os.NetworkOnMainThreadException?

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

如果你发送了很多事件给MainThread Looper,它们将在MainThread(UI Thread)本身上执行。 如果提交任务需要更多时间执行,MainThread将被阻止。

检查下面的postLooper的内部:

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

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