Handler与Looper、MessageQueue的关系:
Android为什么要设计只能通过Handler机制更新UI呢?
最根本的目的就是解决多线程并发问题,
假设如果在一个activity当中,有多个线程去更新UI,并且都没有加锁机制,那么会产生什么样子的问题? –》 更新界面错乱
如果对更新UI的操作都进行加锁处理的话又会产生什么样子的问题?–》
性能下降
出于对以上问题的考虑,Android给我们提供了一套更新UI的机制,我们只需要遵循这样的机制就可以了,根本不用去关心多线程问题,所有的更新UI操作,都是在主线程的消息队列当中去轮询处理的。
Handler封装了消息的发送(主要包括消息发送给谁(一般是发送给handler自己))
Looper
内部包含一个消息队列也就是MessageQueue,所有的Handler发送的消息都走向这个消息队列
Looper.Looper方法,就是一个死循环,不断的从MessageQueue取消息,如果有消息就处理消息,没有消息就阻塞
MessageQueue,就是一个消息队列,可以添加消息,并处理消息
Handler也很简单,内部会跟Looper进行关联,也就是说在Handler的内部可以找Looper,找到Looper,也就找到了MessageQueue,在Handler中发送消息,其实是向MessageQueue队列中发送消息
总结:handler负责发送消息,looper负责接收handler发送的消息,并直接把消息回传给handler自己,MessageQueue就是一个存储消息的容器
Handler的原理是什么?
图解
我的Leader(其实是Looper对象) 我(也就是Handler对象)
( Handler的sendMessage的操作)
第一步: 我要上厕所
第二步: 去吧
(Looper.Looper操作,并把消息回传给我)
第三步:我去上厕所
(handler的handleMessage方法)