J哥---------北京Android各招聘公司面試實戰總結,---------android
From:再三考慮,決定把今天的面試總結一下,算是對自己的總結,如果能順便給正在找工作的朋友有所協助,那就不能再好了。ps: 今天面試真的好累, 昨晚沒睡好,今天早上起床 也沒有吃早飯,餓著肚子跑去面試的。話癆了、、今天面試了兩家公司,早上出門前,感覺兩家穩穩地可以拿下,but結果並不如人意。。
面試公司:健德門 附近某公司面試時間:5月25日 11:00 AM.面試結果:最後聊得工資是 14薪/16K 每天有飯補 。(但是沒有當場給offer,詳情在下面介紹)面試過程:11:00 公司開會(我等,我在等)12: 00-14:00 跟兩位 android程式員+技術總監 pk。14:00-15:00 :跟兩位人事談人生理想.
面試記錄:
11:00 : 到公司,前台後面 擺著桌球, 各種水果,感覺公司氣氛還不錯。 到公司的時候,已經11.00多了,剛好周一他們團隊開會,我就被一個的小哥帶到一個會議室等帶,給倒了杯水,就把哥丟在那了。在會議室,聽到隔壁的會議室,有來參加面試的和人事在那侃大山,略搞笑,依稀記得 還問了,假如 有其他公司 高薪挖你走2828之類的問題。(PPS:面試 技術是一方面,人事也不可以忽略。)
12:00: (一輪PK)終於開會結束了,哥可是餓著肚子呢, 這家公司沒有筆試題,直接一個搞Android的哥們進來,簡單介紹了一下 ,就聊起來了。首先 J哥 簡單介紹了一下 在上一家公司 擔任什麼角色,平時開發流程 之類的,然後J哥 就說大概在公司開發了有5款APP,自己私下接過一款私活,然後自己沒事也做了兩款應用,然後J哥 把應用展示給他看,他看了連連稱讚不錯啊。。。(lalala,其實都是J哥網上巴拉的項目啦。)(然後大體給他介紹了 項目基本架構,是 v4包裡的 SlidingPaneLayout 嵌套了實現了輪詢效果 自訂的viewpager 。然後 具體介面是用的瀑布流,項目的關鍵就是 對 圖片的處理,因為有N張 圖片,但是並沒有卡頓,所以就說了 自己用 了開源的imagedownloader 和 volley 以及自己定義的 lrucache 緩衝 bitmap 對象,這裡大家一定要把圖片的三級緩衝 自己瞭解清楚,基本面試會問到。)其實 當面試問你 如何避免oom ,記憶體泄露導致的原因,以及如何處理大圖片等等,其實都是 如何最佳化記憶體。可以按照我自己總結的回答,你可以說,這個問題 ,跟 oom 以及 記憶體泄露,其實是一樣的,關鍵 就是 如何 最佳化記憶體,避免不必要的 記憶體泄露, 而 記憶體泄露 的原因 ,我總結了 4點, 1. 匿名內部類,和非靜態內部類, 舉個栗子:我們用handler 進行線程間 假如 我們在activity中這樣定義 handler :
Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) { mImageView.setImageBitmap(mBitmap); }} 然後,我們用 右鍵 選中工程 運行 lint工具 , android tools---run lint ,就會提示我們這樣一個`warning: In Android, Handler classes should be static or leaks might occur.`。
就是 ,推薦我們 把handler 定義成static,具體 看這裡解釋的很詳細:http://www.linuxidc.com/Linux/2013-12/94065.htm類似的還有 匿名子線程。
2.還是 拿網上的 栗子來說,
Vector v = new Vector( 10 ); for ( int i = 1 ;i < 100 ; i ++ ){ Object o = new Object(); v.add(o); o = null ; } 即便是 我們把 o 對象 置為 null,但是 vector 集合中還有有o的引用,所以 集合 沒有被清空,這一部分記憶體 還是不能被釋放,這就導致了記憶體泄露。
3, 當我們操作資料庫的時候,我們在執行完 相應的crud 方法後,我們沒有關閉 cursor .close()或者 db.close(),也同樣會佔用記憶體、因為只有關閉串連後,才會被GC 回收。
4.繼續舉個栗子
Set<Person> set = new HashSet<Person>(); Person p1 = new Person("唐僧","pwd1",25); Person p2 = new Person("孫悟空","pwd2",26); Person p3 = new Person("豬八戒","pwd3",27); set.add(p1); set.add(p2); set.add(p3); System.out.println("總共有:"+set.size()+" 個元素!"); //結果:總共有:3 個元素! p3.setAge(2); //修改p3的年齡,此時p3元素對應的hashcode值發生改變 set.remove(p3); //此時remove不掉,造成記憶體流失set.add(p3); //重新添加,居然添加成功 System.out.println("總共有:"+set.size()+" 個元素!"); //結果:總共有:4 個元素! J哥 親自 實踐了下,發現問題了,這個網上的栗子 是錯的。實際上 是可以remove掉得、真是個悲傷地故事。這個栗子是不正確的。。網上好有一片這樣的文章,都是這個栗子。。這裡 看下其他網站上的總結吧 :強烈推薦http://developer.51cto.com/art/201111/302465.htm。很詳細。OK。還有最後一點,就是 關於圖片的,bitmap對象的及時釋放,這裡 就不細說了,等在圖片三級緩衝一起去總結。
此時 感覺 對面的android 小哥 已經被我吸引了。好像很認真的在聽我講課一樣。然後, 他問我問題。我大體總結了一下。面試官01問:有沒有自訂過view。
J哥回答:這個很常見,我自己定義過很多,比如 下拉重新整理,上拉載入更多資料的listview,類似github 上面的pulltorefreshlistview。還有圖片輪詢播放的viewpager,也是 繼承viewpager,然後自己開啟一個線程,去控制 切換的。還比如,跑馬燈效果的textview ,scrollview與 listview 相互嵌套 導致 listview 高度計算不正確,我也是 自訂listview,複寫了 onmeaure方法,然後解決衝突的。在比如 一些開源的 可以放大縮小的圖片,我也是做過,主要是對onmeasure 方法,onlayout方法,ondraw 方法的複寫。以及複寫一下 view 自己的 touch事件等等,奧 對了,我們公司當時有需求 做一個 鎖屏軟體,側滑解鎖的,我也是自己定義的,然後展示給他看了一下,當時 那篇文章在這裡。傳送門http://blog.csdn.net/u011733020/article/details/41863861。
面試官01問:listview的最佳化、
J哥回答:(PS:這種問題,基本上 都快被問爛了,但是沒辦法 還是要回答。) listview 作為最常見的 用來顯示資料的view ,一般 從四個方面 去最佳化。1 ,複用convertview, 不然假如有1000條資料,那麼我們滑動,就會 產生1000個convertview ,這對記憶體是很大的浪費,所以 我們一定要複用。2. 減少 findviewbyid 的次數, 因為 每次 去 執行 findviewbyid 也是要消耗資源的,我們要儘可能的減少,通常 我們定義一個viewholder,去管理 這些id ,然後通過tag 去直接拿到 id。3, 分頁載入,消極式載入 預先載入。 這個在我們以前項目,有一個榜單,資料量很大,一次請求過來的資料量很大,這樣有兩個問題,一個是 請求網路 時間可能會很長,另一個展示資料 上面 體驗對不是很好,所以 我們做了 第一次載入 20條,然後每次請求 再去 載入10條新資料。4.就是 對 listview 中一些 類似頭像, 圖片的 最佳化。這裡 類似 三級緩衝,推薦大家看一下 開源 的universal-image-loader 的源碼。或者 這篇文章http://www.jb51.net/article/38162.htm,J哥有時間 專門寫一篇過於 圖片緩衝的。
面試官01問: 看你簡曆上面 做過 社交,通訊這塊是怎麼做的。
J哥回答:我看 咱們公司 也用到了 聊天,咱們公司是 自己做的 還是 用的第三方的類似 環信的。結果被J哥猜中,他說 是整合的環信(但是 有丟包現象,所以打算自己做通訊)。
OK,J哥說 ,我們 項目中聊天 是基於xmpp協議的做的,在沒有android 以前 ,java 有個 開源的 smack ,android 上 現在有一個asmack ,其實 就是移植到android 中來了, 服務端是基於 openfire的 ,我們就是做的 openfire+asmack 的 聊天,這個原理主要 就是 綁定 ip 拿到 connection 然後 connect ,然後進行通訊,我說,這個 跟http請求 其實原理上一樣,都是 綁定ip,然後 設定一些property,然後通過類似流進行通訊的, asmack,其實底層 就是xml通訊的。
面試官01問: touch 事件的傳遞機制,還特意畫了,一個 就是 button LinearLayout 嵌套 。
J哥回答:就是這個, 這也難不倒我。因為J哥覺得 這個問題肯定會問到 所以 早有準備,這裡 我就大體說下結論,詳細原理 給你傳送門。我回答,這個很簡單,只要你繼承一下 button 和 linearlayout 複寫一下 三個方法 dispatchtouchEvent onInterceptTouchEvent 和onTouchEvent .就能很清楚的明白 傳遞的過程,我給你總的說下結論的,點擊這個button,一般是 外面的父控制項 先響應這個down 事件,然後 往子類裡面傳遞,讓子類 在往子類的下一級子類去傳遞,讓最終的孩子去決定是不要要消費掉這個點擊事件,如果消費掉,那麼父類將不會響應,如果子類不消費,那麼會退回到次級子類,然後看是否要消費,這樣,一句話 就是父傳子, 子決定要不要,不要 然後傳回去。這裡有很詳細 很詳細的介紹, 包裹事件的分發。所以我就不羅嗦,http://blog.csdn.net/yanbober/article/details/45887547?ref=myread
面試官01問: 項目中圖片的最佳化。
J哥回答:我給他展示的項目 其中有一款app 是有很多圖片 ,但是 很流暢,也沒有oom。關於圖片 最佳化,一般我們採用三級緩衝,1 。記憶體載入 2.本地載入 3 網路載入。 首先 我們看 記憶體中有沒有,有直接拿來用,這裡 我項目裡是這樣做的,我先擷取一下 分配給我們應用的可用記憶體是多少,然後 拿1/4 或者 1/8做一個 lrucache. 把我們的bitmap 對象添加進去。有些比較常用的圖片,我會儲存到本地,避免每次重複連網下載。結合 開源的 afinal universalimageloader 以及 13年Google官方推薦的volley(號稱是 asynchttpclient 和
universalimageloader)的結合、 所以 在我的項目中基本沒有遇到過圖片導致的oom 問題,對於單張的 大圖片,我也會利用bitmapFactory,進行計算大小,然後 計算手機解析度,進行定量的 壓縮 處理。
面試官問: GC的回收
J哥回答:我說。GC 回收 應該不只是按照一種方式,應該有多種不同的演算法,我看過Google 官網介紹的一點,有這樣一塊地區,他分為 latest(最近) middle(中等)permanent(永久的),這樣三塊子領域。裡面分別存放,剛剛被建立的,以及 時間 靠後的,很久的,對象,不斷地新對象 往latest裡面添加,當達到相應對象地區的閥值的時候,就會觸發GC,GC 進行回收的時候,對於latest 中回收的速度是最快的,而permanent 相對是最久的,而時間 也跟 每塊地區中對象的個數有關係, 還有一種演算法,是根據最近被引用的時間,或者 被引用的次數 去進行 GC的、、這裡隨便扯就是了。GC 回收並不是立即執行的。是不定時的。GC回收的時候 會阻塞線程,所以代碼中要避免建立不必要的對象,例如for迴圈中 建立大量對象 就會容易引起GC。 當我們也可以主動 在方法中執行system.gc() 去手動釋放一些資源。
面試官01問: 怎麼避免 viewpager 預先載入 fragment的、
J哥回答:這個問題 我也碰到過,我們都知道,viewpager 它本身會預先載入 左右兩個 和當前一個對象、而 我們viewpager setOffscreenPageLimit(0) 不生效因為看源碼知道 這個方法 預設最少也要載入一個。所以 這個fragment 還沒有被當前頁面顯示出來,已經夾在好了,有可能資料不是最新的,我是在 setuservisibilityhint() 這個方法中跟參數 動態去判斷 要不要重新整理的。
問了一圈,這個哥們大概沒什麼問的了,然後 就讓我等一下,說讓他們技術總監過來 。 我就等。。。然後等了幾分鐘,進來一小姑娘,坐下,看了我簡曆,我以為是人事,來跟我談人生理想。結果,沒說幾句話,讓我講一下我的項目。我qu,驚呆我了。我問,你也是做android的,我去,是這樣的、、把J哥嚇到, 然後問了J哥幾個問題。
Android 小姑娘問: 看你項目中的listview 中item類型 是統一的,而加入 item 差別挺大的 你怎麼複用。
J哥回答:J哥裝作很牛的樣子說,我暫時想到兩種方法,1.給這個對象 加一個type 然後 根據 type 去複用,或者 把這幾種類型 一起載入,然後控制顯示隱藏。然後 我反問小姑娘,假如 我這裡 有一百條資料,這一百條是無序的,包含了 10種 item類型,你有沒有什麼好方法 去處理這個問題, 小姑娘說,你不是定義了類型嗎,我們就是 通過type 去判斷的。
Android 小姑娘問: onAttch on
Detach 還是 onAttachedToWindow
onDetachedFromWindow
J哥回答:其實 那個小姑娘忘記這兩個方法了。我說什麼方法,她說onAttachIntent() 和 onDetachIntent(). 反正 J哥是沒聽說過, 我只見過 onAttach , 但是 這個方法 我也沒用過。我就問她,這兩個方法是做什麼的,小姑娘跟我說 是 把子view綁定到介面上的,那麼的話 應該是
onAttachedToWindow
onDetachedFromWindow方法了,小姑娘說: 在這個方法 可以計運算元 view的高度寬度,在 oncreate 裡面不能計算,其實雖然剛開始 在oncreate裡面是不能計算,但是還是有方法計算的,(本人覺得面試 問你 API 是 最2的了,忍不住吐槽下,我遇到過,Camera 拍照,問我擷取 一個圖片 還是 視頻的 方法,我去百度 一下,隨便就知道,真是不懂 為什麼會問方法。隨便一個程式員 都會百度。。)
跟小姑娘聊得其他問題 不太記得了,感覺這個女程式員啊。。就問方法 給我的印象不太好,不管方法用沒用到,我覺得面試 直接問你方法 好2 好2...
然後技術總監 有進來跟我聊了,後技術總監 有進來跟我聊了、技術總監 年齡30出頭吧,到是沒有問我什麼技術問題,
總監: 問我 做沒做過通訊這塊,能不能做這一塊。
J哥回答:
,我說做過,通訊有幾種協議的,我們用的 是xmpp協議的 ,伺服器 是 基於apache的 openfire 搭建的,用戶端 是用的asmack。還有一些 其他協議的 ,比如我知道有些項目中用的 soap協議的,還有ip 協議的。PS:反正就是扯
我說 通訊 用戶端這一塊 我沒問題,但是 服務端 我 從工作以來 一直偏向 android 移動端開發,後台這一塊,如果資料量大了,還要考慮並發之類的,我是做不了,讓我做個tomcat搭建的demo 我可能可以。
其他也是隨便聊了下,然後 就說,讓人事來跟我談理想了。
總監: 問我 什麼時候能上班
J哥回答:我說 這個看公司需求啦。
其他也是隨便聊了下,然後 就說,讓人事來跟我談理想了。
這裡 感覺應該沒問題了。差不多能拿下了。
人事1:一進來,就問東問西。問加班看法啊,他們公司技術 一般都八九點走啊。說七點基本沒有走的啊、、、
J哥回答:我說,一般遇到項目加功能 ,版本升級,等等 這些加班都沒什麼,只要不是一直在加班。。。。這裡每個人自己看法就好了、、反正人事 是一直跟我強調這個,她不停強調 我就暗暗下決心,薪資 我是不會要低了。
人事1:看你還年輕啊,還能拼一拼啊、、、、
J哥回答:我說現在 這幾年對我人生規劃也算比較重要的時期,也是過一年少一年了,其實她的意思 還是側面強調加班。。。。日了UZI了。
中間一堆廢話,然後 我問了她 公司一般上下班時間啊。。之類的有沒有技術交流啊,之類的。。。最後到關鍵問題上啦,最關心的,薪資問題。
人事1:期望薪資
J哥回答:我說16K左右吧。她問 你以前公司多少 握手 15K。她說她們公司 是 14薪。反正 我還是說16K。她說 那好,你等下,然後就出去了。
不知道 跟什麼人 討論了許久,然後又來一個 可能是人事吧。又進來,問了一遍,也問了薪資。。哥還是說16K 。 。。估計是她們公司想要我,但是又覺得有點超出她們薪資期望吧,當場被沒有給什麼offer。然後就有點婉拒的說,兩天給我回覆,心裡很氣憤,餓著肚子 面試到三點,竟然婉拒、、、
反正我是很生氣,我說,好,然後我就走。結果,沒過一個小時,人事又打電話來,非要約我 見一下她們CEO。這是什麼鬼,難道她們CEO要給我煲湯 了?我說可以,然後時間定在後天了,,反正心靈雞湯對我是沒用了、
OK ,這家面試 先寫到這裡,下面 下午還有一家,等下在寫。準備睡覺。今天面試回來,累的就睡著了,晚上十點多才醒過來,想了想還是 把今天面試的過程總結一下。
-------------------------------待續 -------------------------
=====================================================================================