首页 文章

在主线程中创建的处理程序就像在另一个线程上一样

提问于
浏览
1

正如谷歌所说:

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 回答

  • 0

    实际上,它正如您所期望的那样工作,您的处理程序当前与您的主线程相关联,因为它是在其中创建的,并且您的任务也在同一个上运行 . 尝试在for循环中添加 Thread.sleep(1000) 方法,然后您将在UI中看到冻结 . 您的当前代码的复杂度为O(1),因为您的N是常量,并且您的手机能够在几分之一秒内运行它,这就是为什么您在测试期间没有观察到UI中的任何冻结 .

相关问题