一切从android的handler说起(一)之message

 阅读本文大概需要3.2分钟。

 

一切从android的handler说起(一)之message_第1张图片

 

                                                  01

工作十余年,作为android面试官面了都不下百场,handler一直都是我的经典面试题,因为这个问题不仅是android的核心之一,而且还能问得由浅入深,由窄到宽,非常能看出面试者的水平处于哪个层级。

 

很多同学看到handler,就开始笑了,这不都烂大街了吗?其实不然,至少从我面试的情况来看,能让我觉得100%满意的少之又少,这说明很多人都停留在使用层面,而没有深入思考其中的原理。

 

一般我都会拿它暖场,让候选人放松下来。

 

                                                  02

这不,今天来了个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上。

 

                                                              一切从android的handler说起(一)之message_第2张图片

为了让候选人放松一下,我继续提示到,一般你在拿到系统的message的时候设置了什么吗?

小张:一般设置what, object等等属性,供后面做判断和业务逻辑使用。

 

我:嗯,是的,那如果系统就这样把你设置过的message直接放入消息池里,会有什么问题吗?

见小张沉默不语,我又继续提示道:如果不做任何处理,下次obtain拿出来上次使用的message,会不会有什么问题呢?

小张:哦,我大概明白你的意思了。系统应该把message里的所有相关属性值都擦除,防止可能用到之前的遗留值导致出现意想不到的问题。

 

我点点头,哈哈道:对,这就叫完璧归赵。看来你还是有一定悟性的。

小张频频点头,拿起桌上的矿泉水喝了一口,压了压惊。

 

未完待续...


有热爱Android技术的同学,欢迎加 QQ群 726464410,或者扫描QQ群二维码 和 微信公众号二维码。用诙谐的方式学习Android硬核知识点。

                       

                                                                                                   欢迎转发,关注公众号

你可能感兴趣的:(android技术)