歡迎光臨
每天分享高質量文章

記 Android 的一次面試(初級中級水平)

作者:BmobSnail
連結:https://www.jianshu.com/p/f9cad3b7aecb

 

ring ring ring…(這次電話面共43分鐘)

 

面試官:我是xxx的,剛才應該有人和你打過招呼了

我:嗯嗯對,已經有同事和我打過招呼了。

 

面試官:好的,請先簡單自己介紹一下

我:我是大專畢業,工作有三年多了,現在自考本中,之前在三家公司工作過,第一家是和師兄一起創業的外包性質的公司,第二家搞金融服務的,最近的上一家是搞新零售的。我主要有做過幾個方向的app:運動健身、社群服務、房產經紀、家裝貸款、訂餐送餐路徑規劃、短影片、電商的。在上家的主要職責大概有:前期功能需求的研討、開發方案的制訂和成本估算、編碼的實現、應用的最佳化上架、機型相容等等。

 

面試官:嗯好,最近做過的應用有哪些啊?

我:最近的專案有短影片和生活服務類的

 

面試官:你說說這個短影片的應用是怎麼樣的

我:這是一個外包性質的專案,它主要功能就是海外商家充值釋出自家廣告影片,普通使用者瀏覽,然後購買商品的一個電商短影片的應用,因為開發週期短,所以我用了騰訊UGSV的服務,主要就是錄製、特效、混音、釋出這一塊,然後我們自己實現使用者系統和商品系統

 

面試官:裡面有沒有用到什麼比較亮的功能設計,或者你主要負責了哪塊功能模組

我:呃裡面有一點算是比較難的,在釋出影片時的標簽分類,自己實現的動態聯動的一個控制元件,我寫了7天左右,iOS那邊做了半個月。Android 其實就我一個人,所以在上家公司基本都是獨立完成的

 

面試官:嗯那你覺得哪個模組是比較難的

我:影片錄製釋出和商品這塊吧,因為我是基於騰訊的服務去改造的,像影片錄製釋出功能,我們要給影片打水印和釋出的影片收錄到自家後臺,並不完全使用騰訊服務,這一塊功能都是需要改寫

 

面試官:意思就是部分功能基於第三方來修改的,然後使用者和商品就自己實現是吧。好的,那在專案中有沒有用到些什麼設計樣式或者比較新鮮的東西啊,就比如後面接手的人怎麼來維護(很明顯這裡要引出mvp、mvvm的知識點了)

我:因為這個專案開發週期比較短,在考慮專案維護和擴充套件性方面思考得沒那麼周全,但我另外一專案就有這些考慮(被我圓過來了,還好機智)

我:我生活服務類那專案在這些就做的比較好一些,因為舊專案是基於一些開源客戶端來做的,我接手後以mvp的樣式來重構了,刪除了很多冗餘功能

 

面試官:那你說說mvp是什麼

我:說到mvp,就要提一下舊專案,它就是以最原始的vm結構來寫,就是把功能都塞到activity裡面,而mvp就是UI層和資料層分離出來,分別寫到V層和M層,然後透過P層來把兩者互動起來(這裡沒有很系統地描述mvp,減分了)

 

面試官:那mvp有些什麼優點嗎

我:程式碼清晰,層次分明,可維護性(這裡沒有主動找缺點,然後取用出mvvm的出現,減分)

 

面試官:好,平時開發中用過Handler嗎?可以說說這個Handler是怎麼實現的嗎(這時候有點不知道怎麼組織語言了,因為前兩個問題組織語言太亂,我開始有點慌了)

我:(一於把Looper給扯上,這樣起碼有話可說先,調整一下節奏)說到Handler,那就要先說Looper,一般來說looper內部維護了個訊息佇列,它不停地迴圈著,讀取Messageaqueue的訊息,然後透過handler把回呼暴露回給開發者處理

 

面試官:嗯,那有瞭解過Handler的內部實現嗎,比如怎麼通訊的,怎麼傳遞資料(跨行程的知識點了。不扎實啊,減分)

我:呃…不太瞭解,就知道它透過Message來傳輸資料,之前看過下原始碼,這塊知識點有點忘了

 

面試官:那好,假如我需要在子執行緒使用Handler,那我應該需要註意些什麼或者怎麼使用呢

我:首先子執行緒預設沒有Looper的,需要先建立個looper,然後準備一下再讓它執行迴圈動作,這樣handler才能在子執行緒裡生效(這裡最好把prepray和loop的兩個方法說出來,因為可以再深入分析)

 

面試官:有知道Android原生的什麼東西封裝了Handler了嗎?(不太確定原話是不是這麼說,尷尬)

我:應該是AsyncTask和IntentService吧

 

面試官:AsyncTask不是輕量級非同步操作的東西嗎?它怎麼封裝了Handler

我:Handler本來就是為了非同步通訊的元件,主要把子執行緒回呼到主執行緒操作的作用(描述的不夠準確,減分)

 

面試官:平時有看下原始碼的習慣嗎

我:有的,不過也只看些平常用的比較多像View,Activity的啟動之類的(如果原生的沒怎麼接觸,最好說第三方庫)

 

面試官:嗯我對這個Activity的啟動比較好奇,你能簡單說說麼

我:我們在startActivity的時候,其實它底層做了很多操作,首先ActivityThread會根據這個動作獲取到一些資訊,然後看有沒有ApplicayionThread,沒有就new一個有就繼續,然後根據intent資訊,來Instrument生命週期等等,裡面也用到很多跨行程操作(這種回答,給人感覺就像隨便看了篇文章,就說自己知道一樣…不夠系統化甚至步驟都沒闡述清楚)

 

面試官:嗯嗯,對於跨行程,你瞭解嗎?有些什麼通訊方式(真想錘一下自己褲襠,不應該多嘴提跨行程的)

我:還好,跨行程通訊方式有像socket、檔案、記憶體共享、AIDL等等

 

面試官:那他們都有些什麼區別

我:區別肯定有,如果實時要求沒那麼高,那麼可以使用檔案這種方式,要求高的可以使用socket或者AIDL的方式

 

面試官:那你理解AIDL的實現方式麼

我:AIDL的實現比較複雜,平時用的比較少,這一塊不太熟悉(減分了)

 

面試官:那他們的通訊方式有瞭解嗎

我:序列化(腦海只蹦出這麼個關鍵詞,好像有戲)

 

面試官:那怎麼實現序列化的,有哪些方式

我:實現序列化有兩種,實現P…able和S…able,像S…able比較簡單些,它就實現了介面後重寫了個ID,核心就用到了流寫到記憶體寫到檔案,效率相對慢些,而P的重寫了那幾個方法,效率相對好些,但仔細的區別有點忘了(很簡單的兩種區別都記不住,減分)

 

面試官:有瞭解過圖片載入框架嗎

我:有的,像以前用的比較多如ImageLoader,現在是Glide

 

面試官:ImageLoader有什麼地方是比較優秀的值得學習的嗎

我:它的快取機制值得學習,它內部實現了二級快取,首先一級快取在記憶體,二級快取到檔案,下次我們透過url訪問時,先檢查快取裡有沒有記錄。然後還會透過LruCache演演算法來最佳化快取(ImageLoader是三級快取,分別是強取用、軟取用、本地快取)

 

面試官:除了LruCache這個最少使用演演算法,還有什麼其它演演算法的實現?有瞭解過FIFO演演算法麼

我:先進先出演演算法嗎?在ImageLoader上沒有用過,但是之前在學習資料結構的時候瞭解過,像棧和佇列那樣的(這裡我好像回答的有點傻逼,還好沒追問下去)

 

面試官:java這方面怎麼樣?有瞭解過GC嗎?記憶體最佳化效能最佳化這塊做過嗎?

我:垃圾回收機制嗎?還行

 

面試官:那你說一下GC是怎麼操作的

我:說到GC機制,那就是平常遇到比較多的記憶體洩漏的情況,它主要就是因為持有了某個物件,導致回收不了,逐漸記憶體增加直到OOM

 

面試官:它回收垃圾有分幾種方式

我:呃有計數法和可達性分析,就是某個物件被建立的次數,和銷毀時有沒有對應上,如果不一致那就代表還有取用,可達性就是層級遍歷,看上面還有沒有別的物件持有它(我也不知道自己這裡的理解對不對)

 

面試官:還有別的嗎?可達性回收具體怎麼處理的

我:…這…個…還有別的吧,但一時記不起了。可達性就是透過深度遍歷找的吧(我真的一時記不起了了,捂臉)

 

面試官:那記憶體最佳化和效能分析?平時怎麼做最佳化的,用過什麼工具嗎

我:我平時做最佳化首先都是先用monkey做次壓力測試,把最明顯的crash先解決了,然後看看記憶體有沒有抖動什麼的,再結合alloc檔案看看那些物件那些方法使用了多少消耗了多少記憶體

 

面試官:那用過什麼工具嗎?

我:用的比較多就是Monitor Device,MAT有瞭解過,但沒有用到過

 

面試官:今天情況我基本瞭解到這裡了,你上家薪資多少,期望多少,還要別的想要瞭解一下的嗎

我:bilibala一頓後,就問問如果這崗位進去後,主要負責些什麼工作內容

之後的對答就沒有太大參考價值了,如實回答,想問什麼基本都會回答的了,然後儘量表達的強烈意願一些,渴望一些就好了吧。

 

還有幾個關鍵詞的問題:

1.年輕什麼,老什麼,舊什麼(不記得什麼東西了,反正分三段,應該是問記憶體區域還是jvm的知識)- jvm的年輕代、年老代、持久代

2.和服務端通訊用什麼方式(我回答okhttp,他想問json還是xml)- json和xml的解釋讀取以及最佳化結構

3.設計樣式,單例幾種實現的區別,建造者樣式瞭解嗎?(細問餓漢懶載入時機,我回答DoubleCheck和列舉執行緒安全,Builder樣式我回答Dialog的建立)- 常用的即可

4.安卓原生裡面有哪些樣式比較常見(觀察者樣式,我回答了Adapter,廣播)- 像Dialog的builder樣式、反射的代理樣式、bitmap的工廠樣式

已同步到看一看
贊(0)

分享創造快樂