一, 为什么要设计handler
handler根本的目的就是解决多线程并发的问题。
- 如果一个界面中有多个线程去更新UI,并且都没有加锁机制,那么就将导致界面错乱(类似于多线程买票,买到负数)
- 但是我们都加锁的话将会导致性能下降
所以android给我们提供了一套更新UI的机制,我们只需要遵循这样的机制就可以了。根本不用去关心多线程的问题,所以更新UI的操作,都是在主线程的消息队列中去轮询处理的
二,handler,MessageQueue,Looper之间的关系
Looper
- 内部包含一个消息队列MessageQueue,所有的Handler发送的消息都走向这个消息队列
- Looper.looper 方法,就是一个死循环,不断的从MessageQueue取消息,如果有消息就处理消息,没有消息就阻塞
MessageQueue
- 消息队列,可以添加消息,并处理消息
Handler
- 内部会和Looper进行关联,也就是说在Handler的内部也可以找到Looper,找到了Looper也就找到了,MessageQueue,在Handler中发送消息,其实就是向MessageQueue队列中发送消息
- Handler封装了消息的发送(主要包括消息发送给谁)
Handler负责发送消息,Looper负责接收Handler发送的消息,并直接把消息会传给Handler自己,MessageQueue就是一个储存消息的容器
三,源码分析
四,例子
class TestThread extends Thread {
public Handler handler;
public Looper looper;
@Override
public void run() {
looper= Looper.prepare();//拿到looper
handler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
}
};
Looper.loop();//开启队列循环
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_custom_error);
TestThread thread = new TestThread();
thread.handler.sendEmptyMessage(0);//发送消息给子线程handler处理
}
网友评论