一切從android的handler說起(一)之message

 閱讀本文大概需要3.2分鐘。

 

 

                                                  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上。

 

                                                              

爲了讓候選人放鬆一下,我繼續提示到,一般你在拿到系統的message的時候設置了什麼嗎?

小張:一般設置what, object等等屬性,供後面做判斷和業務邏輯使用。

 

我:嗯,是的,那如果系統就這樣把你設置過的message直接放入消息池裏,會有什麼問題嗎?

見小張沉默不語,我又繼續提示道:如果不做任何處理,下次obtain拿出來上次使用的message,會不會有什麼問題呢?

小張:哦,我大概明白你的意思了。系統應該把message裏的所有相關屬性值都擦除,防止可能用到之前的遺留值導致出現意想不到的問題。

 

我點點頭,哈哈道:對,這就叫完璧歸趙。看來你還是有一定悟性的。

小張頻頻點頭,拿起桌上的礦泉水喝了一口,壓了壓驚。

 

未完待續...


有熱愛Android技術的同學,歡迎加 QQ羣 726464410,或者掃描QQ羣二維碼 和 微信公衆號二維碼。用詼諧的方式學習Android硬核知識點。

                       

                                                                                                   歡迎轉發,關注公衆號

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章