在 android 中,Handler 可用于发布/处理消息,如果我不使用 HandlerThread(将其 Looper 传递给 Handler),这是否意味着在这种情况下 Handler 使用 MainThread(UI Thread)的 Looper?
如果 Handler 使用 MainThread 的 Looper 会得到什么结果?可能导致 mainThread 阻塞?
在 android 中,Handler 可用于发布/处理消息,如果我不使用 HandlerThread(将其 Looper 传递给 Handler),这是否意味着在这种情况下 Handler 使用 MainThread(UI Thread)的 Looper?
如果 Handler 使用 MainThread 的 Looper 会得到什么结果?可能导致 mainThread 阻塞?
如果您想一次执行一项后台任务,并且希望这些任务按执行顺序运行,则可以使用 HandlerThread。
比如你要一个一个地做几个网络后台操作。
是的,HandlerThread 有它自己的循环器,并且可以创建处理程序并将其发布(因此它不会阻塞主线程)。
像这样使用 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,是一种方便的方式。
当您创建一个新的处理程序时,它会绑定到创建它的线程的线程/消息队列 - 请参阅官方文档...
如果我不使用 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 来创建处理程序类。
请注意,仍然必须调用 start()。
HanderThread
类继承自Thread类,封装了Looper对象,这样我们就不用关心Looper打开和释放的细节了。就像在普通线程的情况下,我们需要使用Looper.prepare()
并将Looper.loop()
其转换为LooperThread
.
每个人似乎都解释了它的作用以及它是如何使用的,但是忘记解释这个线程需要在开发人员使用后进行清理,否则它会泄漏。使用后您必须致电
thread.quit()
退出而不处理队列中的消息或
thread.quitSafely();
处理当前在队列中的消息。
当您想要执行大量后台任务时,HandlerThread 很有用,因为它有自己的循环器。通常,如果您向 Handler 发布消息,它会使用 MainThread 的 looper。这意味着任务在 UI 线程上执行。但是在 HandlerThread 的情况下,这些任务是在工作线程上执行的。你可以在这里找到更详细的解释