Handler详解

Handler是什么

handler是android给我们提供的一套用来跟新UI的机制,也是一套消息处理机制,我们可以发送消息,也可以用它处理消息。

android不能再非UI线程中直接去更新UI,android在设计的时候就封装了一套消息创建,传递,处理机制,如果不遵循这样一套机制,就没办法更新UI,就会抛出异常。

Handler用法

sendMessage();

sendMessageDelayed();

post(Runnable);

postDelayed(Runnable,long);

handler.removeCallbacks(runnable);//移除runnable


private Handlerhandler =new Handler(new Handler.Callback() {

@Override

    public boolean handleMessage(Message msg) {

        toast("111");

return false;//如果return true 则可以拦截handlemessage,

    }

}){

@Override

    public void handleMessage(Message msg) {

super.handleMessage(msg);

    toast("222");

    }

};

boolean返回值的handlerMessage方法如果返回false 吐司111和222都打印 如果返回true,则拦截掉吐司222,只打印了111


android为什么要设计只能通过Handler机制更新UI

最根本的目的是解决多线程并发的问题。

假如一个activity中, 有多个线程去更新UI,并且都没有加锁,会产生什么问题? 更新界面错乱。

那如果都进行了加锁会产生什么问题?性能下降。

处于以上问题的考虑,android为我们提供了一套更新UI的机制,所有的更新UI操作,都在主线程的消息队列中去轮训处理。我们只要遵循就可以了

Handler原理

一、Handler封装了消息的发送(主要包括消息发送给谁)

Looper(消息封装的一个载体,里面有MessageQueue)

1.内部包含了一个消息队列,也就是MessageQueue,所有的Handler发送的消息都走向这个消息队列。

2.Looper.Looper方法,就是一个死循环,不断的从MessageQueue中取消息,有消息就处理,没有消息就阻塞。

二、MessageQueue就是一个消息队列,可以添加消息并处理消息。

三、Handler也很简单,内部通过构造方法跟Looper进行关联,也就是说在Handler内部可以找到Looper,找到了Looper就找到了MessageQueue,在Hander中发消息,其实就是向MessageQueue发消息。

总结:Handler负责发消息,Looper负责接收Handler发送的消息,并直接把消息回传给handler自己。MessageQueue就是一个消息存储的容器。



android更新UI的四种方式

runOnUiThread();

handler post();

handler sendMessage();

view  post();

你可能感兴趣的:(Handler详解)