Android面試一天一題(6 Day)

面試多了,總會(huì)遇到一些奇葩的事情。有一次面試一家做航空娛樂系統(tǒng)開發(fā)的公司,老板是新加坡人。面試我的是一個(gè)小伙子,感覺是個(gè)小leader吧,很靦腆。他把我叫到一間堆滿飛機(jī)坐椅和屏幕的辦公室,只問了我兩分鐘就走了。問了幾個(gè)很基礎(chǔ)的問題,基礎(chǔ)到我對(duì)他的問題完全沒有印象。哥哥正在納悶還有十八般武藝沒有使呢,HR就來叫我去經(jīng)理室,經(jīng)理很爽快的問我要多少工資,要不要提成分紅等問題,就說要等他的新加坡老板做決定。不到兩分鐘,經(jīng)理的面試也經(jīng)束了。全程都不帶自我介紹的,我在軟件園這片區(qū)這么有名了?

第二天,新加坡老板給我打了電話,進(jìn)行了一個(gè)簡(jiǎn)單的電話面試,雙方答成了協(xié)義,算是通過了面試。之后HR就給我發(fā)了Offer。到這時(shí)候我都感覺很神奇,然后再回頭去看看自己的簡(jiǎn)歷,沒有出奇的地方啊,看不出是高手啊,怎么對(duì)方這么爽快呢?也不多了解了解,我心里對(duì)這家公司也產(chǎn)生一些疑惑,沒有過五關(guān)斬六將得到的offer總感覺不踏實(shí)。后來因?yàn)楝F(xiàn)今這家公司也發(fā)了offer,權(quán)衡了一下就沒去。

和新加坡老板電話道歉了,他感到很惋惜, 這是這么多次面試讓我感到很無(wú)厘頭的一次,有時(shí)真想去這家公司問問是怎么回事。

好吧,故事講完了,我們接著上一題,很多網(wǎng)友留言表示對(duì)View保存狀態(tài)要設(shè)置ID這一點(diǎn)感興趣。有網(wǎng)友提了這個(gè)問題:

面試題:通過new創(chuàng)建的View實(shí)例它的onSaveStateInstance會(huì)被調(diào)用嗎?

這里再?gòu)?qiáng)調(diào)一下,自定義View控件的狀態(tài)被保存需要滿足兩個(gè)條件:

  1. View有唯一的ID;
  1. View的初始化時(shí)要調(diào)用setSaveEnabled(true)

簡(jiǎn)單看一下View狀態(tài)保存和讀取的調(diào)用過程:


里面的SparseArray(完整的參數(shù)是:SparseArray<Parcelable> )是一個(gè)KEY-VALUE的Map,KEY當(dāng)然就是View的ID了。所以細(xì)看一下源碼的調(diào)用過程,你一下就理解為什么一定要給View調(diào)置一個(gè)唯一的ID了。

那好,現(xiàn)在回答上這個(gè)網(wǎng)友的問題“通過new創(chuàng)建的View實(shí)例它的onSaveStateInstance會(huì)被調(diào)用嗎?”,答案還是一樣的如果設(shè)置了ID就會(huì)。其實(shí)我們?cè)赬ML文件中配置的布局和屬性最終都是通過LayoutInflater中的inflate方法去加載,由它去創(chuàng)建各個(gè)View的實(shí)例(還是用new),并根據(jù)XML文件中的屬性設(shè)置相關(guān)的值。

我們?cè)僬归_一下,如果我們定義了一個(gè)自義的Layout,在同一個(gè)界面中引用了兩次這個(gè)自定義的Layout(如下圖的myLayout1 & myLayout2),那么它的狀態(tài)會(huì)發(fā)生什么情況呢?

我們會(huì)發(fā)現(xiàn)兩個(gè)Layout的狀態(tài)被保存了,但Layout中的每個(gè)子View狀態(tài)是相同的,被最后一個(gè)保存的View覆蓋了。這也是為什么我們要強(qiáng)調(diào)View的ID要唯一的原因。

如何解決這個(gè)問題呢?留給大家去展開吧,你是面試官的話,也可以留給來面試的人,不過這里太細(xì)節(jié)了建議最好做為附加題讓對(duì)方試試(答不上不扣分)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容