【7】Handler

一、什么是Handler

handler是因为android只能在主线程(UI线程)中更新界面,谷歌官方为我们提供的一个传递消息的帮助类。通过使用它可以解决线程不同步导致的UI界面混乱问题。

二、Handler的运行逻辑

先上代码(此为案例,handler应写在主线程中,不推荐这样写)

class Mythread extends HandlerThread{//可防止线程不同步导致的空指针错误
        public Handler handler;

        public Mythread(String name) {
            super(name);
        }

        public Mythread(String name, int priority) {
            super(name, priority);
        }

        @Override
        public void run() {
            Looper.prepare();//looper初始化
            handler = new Handler(){
                @Override
                public void handleMessage(Message msg) {
                    Log.i("TWO","MyThread线程Id = "+ Thread.currentThread());
                }
            };

            Looper.loop();//looper启动
        }

    }

以上代码中可以看到需要启动handler,先要初始化Looper,最后要启动Looper
其中Handler相当于一个收发货物的工人,Looper是一个有序列的传送带,Message则是传送带上的货物。

三、利用Handler更新UI的四种方式

android中更新UI的四种方式

  1. 在子线程中调用handler.post()方法
  2. 在子线程中调用handler.sendMessage()方法
  3. 在子线程中调用Activity的runOnUiThread()方法
  4. 在子线程中调用view的post()方法

PS:其本质上都是通过调用handler的sendMessage方法来实现的。

private TextView textView;
    private Handler handler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            textView.setText("OK_2");
        }
    };

    private void handler1(){//方法一
        handler.post(new Runnable() {
            @Override
            public void run() {
                textView.setText("OK_1");
            }
        });
    };

    private void handler2(){//方法二
        handler.sendEmptyMessage(1);
    }

    private void handler3(){//方法三
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                textView.setText("OK3");
            }
        });
    }

    private void handler4(){//方法四
        textView.post(new Runnable() {
            @Override
            public void run() {
                textView.setText("OK4");
            }
        });
    }

你可能感兴趣的:(【7】Handler)