Handler面试100问

93 阅读2分钟

面试官:说一个你最熟悉的知识

面试者:平时用Handler比较多

面试官:好好好,你说你熟悉Handler是吧

面试官:Handler同一个消息可以发送两次么

面试者:平时一个消息就发过啊,我也没试过两次啊,算了蒙一个吧,可以

面试官:Handler是如何执行延迟消息的,

面试者:这个我看过,是根据执行的时间,在插入消息的时候进行排序,等到指定时间自动唤醒,取出该消息分发给handler执行

面试官:那这个执行的时间是如何确定的

面试者:哎呀这快没注意过,是System.currentTimeMillis()吧

面试官:Handler发送的延迟消息可靠么?

面试者:我擦,平时也没注意可不可靠,既然是官方提供的,应该可靠吧

面试官:Hanler是线程安全的么?是怎么保证的呢

面试者:安全吧,要不ui不乱套了。必然是加了锁

面试官:好,Handler发送一个普通消息默认code是什么

面试者:(内心os)我平时也没让消息默认过啊,随便蒙一个吧,是0

面试官:那如果我移除这个code为0的消息会怎样

面试者:卧槽,我平时也不这么用啊,我都是有code的啊,只好回答不知道。

面试官:Handler可以在子线程发送消息么

面试者:知道,但是需要先创建子线程的Looper,并调用Looper.prepare()

面试官:为什么呢?

面试者:不知道。。。

面试官:知道ThreadLocal么,为什么一个线程只有一个Looper

面试者:不知道

面试官:你知道Handler的同步屏障么

面试者:知道,当 MessageQueue 设置同步屏障之后,在 next 方法获取消息时会忽略所有的同步消息,只取异步消息,也就是说异步消息在此时的优先级更高。而 TraversalRunnable 会被封装到一个异步的 Message 中,因此 View 绘制的一系列操作会被优先执行,这也是提高渲染性能的一种手段。

面试官:如何设置同步屏障,如何发送异步消息

面试者:我擦我咋知道,我平时也不发啊。。。

面试官:回去等通知吧