面试官:说一个你最熟悉的知识
面试者:平时用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 绘制的一系列操作会被优先执行,这也是提高渲染性能的一种手段。
面试官:如何设置同步屏障,如何发送异步消息
面试者:我擦我咋知道,我平时也不发啊。。。
面试官:回去等通知吧