Handler详解

Handler剖析

1.概念:

1.当运行项目时,会首先创建MainActivity,当用户进行一些处理例如,点击事件时,Ui会响应用户的操作,直接进行更新UI操作,但是当执行一些耗时操作时,必须在子线程中进行,子线程中无法更新UI,这就需要用到Handler的消息队列,发送Message消息队列,通过Handler进行Ui的更新Handler是Android提供的更新UI的一套机制,也是一套消息处理机制。可以使用它发送消息。也可以用它接收消息
2.为什么只有Handler才能更新UI
因为当使用多个线程去更新UI时,而且没有加锁机制,那么就会出现系统的错乱。如果加锁,则会导致ui的性能下降,用户体验不佳
    针对上述的问题Android提供了Handler,这一套更新ui的机制。所以当我们更新ui的时候根本不用考虑多线程的问题,再更新ui的机制中,都是在主线程的消息队列中轮询处理的

2.原理图

Handler详解_第1张图片

3.Handler怎么用

    message消息,time:每隔time的时间发送一次消息

    sendMessage(Message message)
    sendMessageDelayed(Message message,long time)
    post(Runnable runnable)
    postDelayed(Runnable runnable,long time)

4.Handler更新UI的四种方法

1.handler sendMessage:子线程发送消息到主线程,通过接收到的消息在主线程更新Ui
//主线程
 private Handler handler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            textView.setText(msg.what+"");
    }
}
//子线程
 new Thread(){
            @Override
            public void run() {
                super.run();
                try {
                    Thread.sleep(2000);
                    handler.sendEmptyMessage(1);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

2.handle post

  private Handler handler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            handler.post(new Runnable() {
                @Override
                public void run() {
                    textView.setText("OK");
                }
            });

3.View post

  private Handler handler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            textView.post(new Runnable() {
                @Override
                public void run() {
                    textView.setText("OK");
               }
         });
     }
}

4.runOnUiThread

 runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        textView.setText("Odsd");
                    }
                });

总结:以上四种方法岁都不同,但是本质都是根据handler的sendMessage()发送消息恒心Ui的,(详情请查看源码)

4.异常分析(Handler常见的两种异常)

1.
译文:仅仅只有主线程可以更新Ui
2.

//这是Handler的Android源码
 mLooper = Looper.myLooper();
        if (mLooper == null) {//当Looper为空时抛出异常
            throw new RuntimeException(
                "Can't create handler inside thread that has not called Looper.prepare()");
        }

在子线程中创建Handler时必须指定Looper,否则会报出此异常

你可能感兴趣的:(android,UI,UI,handler,looper)