为什么我可以通过looper在非uithread中触摸UI?

时间:2014-07-15 07:55:03

标签: android multithreading looper

    thread = new Thread() {
        public void run() {
            super.run();
            System.out.println("run:" + Thread.currentThread().getName());
            Looper.prepare();
            handler = new Handler();
            Looper.loop();
        };
    };
    thread.start();

然后

    handler.post(new Runnable() {
        @Override
        public void run() {
            Toast.makeText(MActivity.this,Thread.currentThread().getName(),0).show();
        }
    });

代码运行正确。

但是吐司显示:" Thread-217"

这意味着toast从非uithread显示。

为什么?


我很抱歉。我知道答案。 Toast是一个特殊的UI元素。它可以从任何线程中显示出来。但是其他UI元素,例如Button TextView,只能在UI线程中触及。 所以,我的代码运行正确,但是当您将Toast更改为Button时,会崩溃。

2 个答案:

答案 0 :(得分:1)

你试图在UI线程中使用runnable显示toast,这就是为什么它出错了

  Thread background = new Thread(new Runnable() {   
        public void run() {
                         // Send message to handler
                            handler.sendMessage(msgObj);
                        }
      };




      private final Handler handler = new Handler() {
               public void handleMessage(Message msg) {
                  //Catch the response and show the toast
                  String aResponse = msg.getData().getString("message");

                  Toast.makeText(getBaseContext(),"Not Got Response From Server.",
                         Toast.LENGTH_SHORT).show();
                                }
          };

答案 1 :(得分:1)

您必须在UiThread中创建处理程序。处理程序将消息发送到创建它的线程。

handler = new Handler();

thread = new Thread() {
        public void run() {
            super.run();
            System.out.println("run:" + Thread.currentThread().getName());
            Looper.prepare();
            Looper.loop();
        };
    };
    thread.start();