【问题标题】:Where does main or UI thread in android prepare looper?android中的main或UI线程在哪里准备looper?
【发布时间】:2016-02-21 03:09:11
【问题描述】:

似乎在主线程中我只需要编写一个扩展 Handler 的类并覆盖它的 handleMessage 方法。然后我可以创建 Handler 对象而无需准备循环器。

class myHandler extends Handler{

    @Override
    public void handleMessage(Message msg) {
        super.handleMessage(msg);
        String s=(String)msg.obj;
        textView.setText(s);
    }
}

在主线程中,以下代码有效:

handler=new myHandler();

但是在工作线程中确实需要先准备looper,然后才能创建Handler对象,否则threadLocal.get()无法获取当前工作线程的looper。我的问题是必须有某个地方为主线程准备弯针,但我就是找不到它。我不知道 threadLocal 是如何为主线程找到这个 looper 的。

class WorkerThread extends Thread{
    @Override
    public void run() {
        // TODO Auto-generated method stub
        super.run();
        Looper.prepare();
        handler=new Handler(){

            @Override
            public void handleMessage(Message msg) {
                // TODO Auto-generated method stub
                super.handleMessage(msg);
                System.out.println(msg.obj.toString());
                System.out.println(Thread.currentThread().getName());
            }

        };

        Looper.loop();
    }

}

【问题讨论】:

  • here
  • 我想知道完全相同的问题。主线程Looper什么时候准备好。它确定它不会在应用程序类中自行准备。你不能在 Application 类中创建 Handler。

标签: java android multithreading handler


【解决方案1】:

主循环器是在ActivityThread类的main方法中准备的,方法调用如下:

Looper.prepareMainLooper();

查看源代码,例如here

【讨论】:

  • 实际上这是确切的答案,尽管 OP 似乎没有看到这个。
【解决方案2】:

你必须在你的主线程中定义 Looper。

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

您可以从主线程或其他工作线程调用此方法。请谨慎。

void timerMethod(){
    handler.postDelayed(new Runnable() {
        public void run() {
            setTime();
        }
    }, timeDelay);
}

【讨论】:

    猜你喜欢
    • 2023-04-01
    • 2013-07-11
    • 2017-07-17
    • 2013-09-17
    • 1970-01-01
    • 2016-05-27
    • 2016-10-31
    • 2018-05-20
    相关资源
    最近更新 更多