在主线程创建的处理程序就像它是在另一个线程(Handler created in main thre

2019-09-29 09:22发布

由于谷歌说:

一个处理程序允许您发送和处理信息,并与一个线程的MessageQueue关联Runnable对象。 每个处理程序实例与单个线程和线程的消息队列相关联。 当你创建一个新的处理程序,它被绑定到线程的线程/消息队列是创造它 - 从这一点上来说,这将提供信息和可运行到消息队列,并执行它们,因为他们出来的消息队列。

我预计,当我创建的主线程(UI线程)处理程序,它重视这个线程,从而导致其冻结UI,直到最后它的任务。 但在测试这不会发生,它的作用就像是一个backgound线程,做他的任务并行。 我用这样的创建手柄:

 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()是不够复杂,但为什么我们看到“登录外”之前“登录处理程序:”如果他们是在同一个线程。

Answer 1:

其实,它的工作如你预期,你的处理器目前正与你的主线程,因为它是在它创建你的任务是在同一个还运行有关。 尝试添加您的循环内的Thread.sleep(1000)的方法,那么你将看到你的UI冻结。 您当前的代码与复杂度O运行(1),因为你的N是恒定的,而你的手机是有足够的能力来在几分之一秒内运行此,这就是为什么你是不是在测试过程中观察你的UI任何冻结。



文章来源: Handler created in main thread acts like it is on another thread