Handler面试问答
1、 Handler的作用
根据源码中Handler类的注释,Handler有2个作用:
(1) 实现线程切换,具体的,比如在非UI线程更新UI
(2) 发送延时消息
2、 为什么Android设计只能UI线程更新ui?
这是由于Android对视图更新采用了单线程模型。为什么采用单线程模型,是由于视图控件不是线程安全的,如果在多线程中并发访问可能会导致UI控件处于不可期的状态,那为什么系统不对UI控件的访问增加锁机制呢?这样做,缺点有两个:一是,锁机制会让UI的访问逻辑变得复杂;而是,锁机制会降低UI的访问效率。由于这些缺点,最简单高效的方法就是采用单线程模型来处理UI操作。这样带来的好处有:
(1) 解决多线程并发的问题
(2) 简化了UI的访问
(3) 提高了UI操作的效率
3、 Handler和Looper是一一对应的吗?Handler、Looper、MessageQueue之间的关系?
Handler与Looper是多对一的关系,一个Looper可以对应多个Handler;Looper与Thread是一对一的关系;Looper与MessageQueue也是一对一的关系,一个MessageQueue会存在0个或多个Message。
Handler封装了消息的发送,主要负责发送和处理消息;
Looper内部包含一个消息队列,所有的Handler的消息都发送到这个队列,loop方法是一个死循环,不断的从消息队列取消息,有消息就处理,没有就阻塞;
MessageQueue是一个消息队列,但是其内部数据结构是一个Message的单链表,可以添加消息、移除消息,其阻塞是通过native代码实现的;
Message内部持有Handler,所以会交给正确的Handler处理,而不会错乱。
4、 子线程更新UI控件的方法有哪些?
(1) Activity.runOnUiThread
(2) View.post
(3) View.postDelayed
(4) AsyncTask
(5) Handler
其实这几种的底层实现都是Handler。
待续补充。。。