正如谷歌所说:
Handler允许您发送和处理与线程的MessageQueue关联的Message和Runnable对象 . 每个Handler实例都与一个线程和该线程的消息队列相关联 . 当您创建一个新的Handler时,它被绑定到正在创建它的线程的线程/消息队列 - 从那时起,它将消息和runnables传递给该消息队列并在消息出来时执行它们队列 .
我希望当我在主线程(UI线程)中创建一个Handler时,它会附加到此线程,因此它会导致冻结ui直到结束它的任务 . 但是在测试中,这不会发生,并且它就像是在背景线程上并且完成他的任务并行 . 我曾经像这样创建Handle:
Handler mainHandler = new Handler(Looper.getMainLooper());
Runnable runnable = new Runnable() {
@Override
public void run() {
for (int i = 0; i < 35000; i++) {
log.i(TAG,"log in Handler:"+i);
}}
};
mainHandler.post(runnable);
log.i(TAG,"log outSide");
在mainActivity中(所以句柄应该绑定到主线程) . 那么问题是什么,或者我是以错误的方式创建处理程序?
有些朋友注意到 doSomthing()
不够复杂,但为什么我们在"log in Handler:"之前看到"log outSide"如果它们在同一个线程中 .
1 回答
实际上,它正如您所期望的那样工作,您的处理程序当前与您的主线程相关联,因为它是在其中创建的,并且您的任务也在同一个上运行 . 尝试在for循环中添加 Thread.sleep(1000) 方法,然后您将在UI中看到冻结 . 您的当前代码的复杂度为O(1),因为您的N是常量,并且您的手机能够在几分之一秒内运行它,这就是为什么您在测试期间没有观察到UI中的任何冻结 .