Handler面试问答

2017-10-31  本文已影响15人  曾是放牛娃

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。

待续补充。。。

上一篇下一篇

猜你喜欢

热点阅读