“ 阅读本文大概需要3.2分钟。”
工作十余年,作为android面试官面了都不下百场,handler一直都是我的经典面试题,因为这个问题不仅是android的核心之一,而且还能问得由浅入深,由窄到宽,非常能看出面试者的水平处于哪个层级。
很多同学看到handler,就开始笑了,这不都烂大街了吗?其实不然,至少从我面试的情况来看,能让我觉得100%满意的少之又少,这说明很多人都停留在使用层面,而没有深入思考其中的原理。
一般我都会拿它暖场,让候选人放松下来。
这不,今天来了个android开发候选人,叫小张,我递了一瓶矿泉水,让小张坐下,微笑脸?。
我:能简单的自我介绍一下吗?
小张:balabala...
我: 看你做android项目挺多的,能大概说一下android里handler,looper,message queue的相互关系吗?
小张:每个线程里只能有唯一的looper和与之绑定的message queue, looper不断的从message queue里取message,扔给handler的handleMessage处理。
一般这个问题能清晰的说出来的占90%,所以小张能回答出来我并不意外。
我又问:looper取出来的message怎么知道扔给哪个handler呢?
小张:handler在sendMessage时,message会设置其target属性指向发送的handler对象,所以取出来时就知道扔给哪个handler处理了。
这个问题能答出来我会嘴角微微上扬,内心毫无波澜,还不错,好,继续。
我:那message你一般怎么生成呢?
一般有2种回答
第1种:new一个啊
第2种:一般用message.obtain()获得一个message来使用。
第一种回答,我知道后面这条路是不能继续问下去了。第二种回答,我会给他稍微放一个小招。
我:这个obtain听起来像是从某个地方去拿的感觉,能说一下是哪里吗?
小张:沉默和故作思考10s之后...不是很清楚...
90%的候选人到这里,基本上都会卡壳,很正常,作为一名合格的面试官,我会给予适当的提示。
我:android里有个message pool即消息池,专门供开发者使用
小张:恍然大悟,哦...明白了,系统的message pool里事先已经new一些message放在里面供我们去拿来用。
我:嗯,是的,小伙子理解得够快,那你知道message用完后,这个message应该如何处理吗?
小张人心里眉头紧锁,心里肯定是一万匹羊驼跑过,没想到还有后招...这个...不是很清楚。
我微笑道:既然是message pool,那肯定是不能只借不还,不然消息池里的message不是很快用完了吗,应该怎么办呢?
小张这一次很快反应过来了,答道:哦,对!系统在我们使用完后要回收进message pool里,供将来继续使用,维持生态平衡。
我:嗯,挺聪明的,这就叫有借有还,再借不难。但是系统回收message的时候会对这个message做什么善后处理吗?
小张再一次受到了暴击,万万没想到还有需要考虑的点!!!没想到今天出师不利,一来就绊倒在这个小小的message上。
为了让候选人放松一下,我继续提示到,一般你在拿到系统的message的时候设置了什么吗?
小张:一般设置what, object等等属性,供后面做判断和业务逻辑使用。
我:嗯,是的,那如果系统就这样把你设置过的message直接放入消息池里,会有什么问题吗?
见小张沉默不语,我又继续提示道:如果不做任何处理,下次obtain拿出来上次使用的message,会不会有什么问题呢?
小张:哦,我大概明白你的意思了。系统应该把message里的所有相关属性值都擦除,防止可能用到之前的遗留值导致出现意想不到的问题。
我点点头,哈哈道:对,这就叫完璧归赵。看来你还是有一定悟性的。
小张频频点头,拿起桌上的矿泉水喝了一口,压了压惊。
未完待续...
有热爱Android技术的同学,欢迎加 QQ群 726464410,或者扫描QQ群二维码 和 微信公众号二维码。用诙谐的方式学习Android硬核知识点。
欢迎转发,关注公众号