2018最新 Android 面試題總結(三)
Q:專案中如何做效能優化的?
舉例說明專案注意了哪些方面的效能優化,如佈局優化、繪製優化、記憶體洩漏優化、 響應速度優化、列表優化、Bitmap優化、 執行緒優化......
ofollow,noindex">效能優化一
效能優化二Q:瞭解哪些效能優化的工具?
效能優化工具
思路:做專案時是否使用過的系統自帶的效能優化工具?公司是否有自己的效能優化工具?實現原理怎樣的? LeakCanary工具
Q:佈局上如何優化?
佈局優化的核心就是儘量減少佈局檔案的層級,常見的方式有:
多巢狀情況下可使用RelativeLayout減少巢狀。
佈局層級相同的情況下使用LinearLayout,它比RelativeLayout更高效。
使用<include>標籤重用佈局、<merge>標籤減少層級、<ViewStub>標籤懶載入(適合在某些條件顯示的佈局,如:網路錯誤,資料載入失敗等)。
Q:記憶體洩漏是什麼?為什麼會發生?常見哪些記憶體洩漏的例子?都是怎麼解決的?
記憶體洩漏(Memory Leak)是指程式在申請記憶體後,無法釋放已申請的記憶體空間。簡單地說,發生記憶體洩漏是由於長週期物件持有對短週期物件的引用,使得短週期物件不能被及時回收。常見的幾個例子和解決辦法:
單例模式導致的記憶體洩漏:單例傳入引數this來自Activity,使得持有對Activity的引用。
解決辦法:傳參context.getApplicationContext()
Handler導致的記憶體洩漏:Message持有對Handler的引用,而非靜態內部類的Handler又隱式持有對外部類Activity的引用,使得引用關係會保持至訊息得到處理,從而阻止了Activity的回收。
解決辦法:使用靜態內部類+WeakReference弱引用;當外部類結束生命週期時清空訊息佇列。
執行緒導致的記憶體洩漏:AsyncTask/Runnable以匿名內部類的方式存在,會隱式持有對所在Activity的引用。
解決辦法:將AsyncTask和Runnable設為靜態內部類或獨立出來;線上程內部採用弱引用儲存Context引用
資源未關閉導致的記憶體洩漏:未及時登出資源導致記憶體洩漏,如BraodcastReceiver、File、Cursor、Stream、Bitmap等。
解決辦法:在Activity銷燬的時候要及時關閉或者登出。
BraodcastReceiver:呼叫unregisterReceiver()登出;
Cursor,Stream、File:呼叫close()關閉;
動畫:在Activity.onDestroy()中呼叫Animator.cancel()停止動畫
引申:談談專案中是如何注意記憶體洩漏的問題
記憶體洩漏和記憶體溢位的區別
記憶體洩漏(Memory Leak)是指程式在申請記憶體後,無法釋放已申請的記憶體空間。是造成應用程式OOM的主要原因之一。
記憶體溢位(out of memory)是指程式在申請記憶體時,沒有足夠的記憶體空間供其使用。
Q:什麼情況會導致記憶體溢位?
記憶體洩漏是導致記憶體溢位的主要原因;直接載入大圖片也易造成記憶體溢位
引申:談談如何避免記憶體溢位(如何避免記憶體洩漏、避免直接載入大圖片)
開源框架(略)
參考回答:Git和SVN的區別有以下幾點:
Git是分散式的,而SVN是集中式的(核心區別)
Git按元資料方式儲存內容,而SVN按檔案儲存內容
在Git上每個工作成員可以任意在自己的本地版本庫開啟無限個分支且互不影響,而對於SVN分支是一個完整的目錄且這個目錄擁有完整的實際檔案
Git沒有一個全域性的版本號,而SVN有
Git 的內容完整性要優於SVN
在Git中的絕大多數操作都只需要訪問本地檔案和資源,不必聯網就可以看到所有的歷史版本記錄,而SVN 卻需要聯網
引申:談談兩種版本控制工具的優缺點: SVN與GIT的優缺點對比
Q:瞭解Git工具嗎?用過哪些命令?解決衝突時git merge和git rebase的區別?
通過圖記憶Git常用命令,詳見Git、GitHub、Stash
參考回答: 常用命令見圖,源自 一篇文章,教你學會Git
合併用到的命令git merge與git rebase的區別是,git merge會生成一個新的節點,並將之前的提交分開顯示;git rebase操作不會生成新的節點,而是將兩個分支

image.png
`Q:記憶體洩漏的場景,Handler記憶體洩漏的原因以及解決方法
`Q:Handler機制,主執行緒如何向子執行緒傳送訊息,Handler能否多程序通訊
`Q:單例模式的幾種實現具體的區別,工廠模式的種類以及區別
`Q:Android的觸控事件分發流程
`Q:Android第三方框架的原始碼實現原理
`Q:Activity的啟動流程,這個有點意思
`Q:資料的儲存方式與其的應用場景,ContentProvider的底層實現,如何保證多程序讀寫安全
`Q:hashmap的底層實現
`Q:靜態廣播和動態廣播區別,service啟動的兩種方式區別
`Q:場景題分析:手機掃網頁端的二維碼如何提起的登入的過程,是如何實現的?
`Q:代理模式
`Q:單例模式以及雙重鎖原理
`Q:觀察者模式應用場景
`Q:單例模式的幾種實現具體的區別,工廠模式的種類以及區別
多執行緒併發,sychronized,類鎖和物件鎖