Search code examples
androidmultithreadinglooper

why can I touch UI in non-uithread by 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();

And then

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

the code run correct.

but the toast shows :"Thread-217"

that means the toast shows from a non-uithread.

why?


I am so sorry. I know answer. Toast is a special UI element. It can be showed from any thread. But the other UI elements ,such as Button TextView must only be touched in the UI-thread. So,my code runs correct,but when you change the toast to Button ,is crashed.


Solution

  • You are trying to show toast in a UI thread using runnable thats why its going wrong

      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();
                                    }
              };