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