面試題一:談談你對 Android 性能優化方面的了解?
1)啟動優化: application中不要做大量耗時操作,如果必須的話,建議異步做耗時操作,
2)布局優化: 使用合理的控制元件選擇,少嵌套,(合理使用 include,merge,viewStub等使用)
3)apk優化(資源檔案優化,代碼優化,lint檢查,.9.png,合理使用 shape 替代圖片,webp等)
4)性能優化,網路優化,電量優化
- 避免輪詢,盡量使用推送,
- 應用處于后臺時,禁用某些資料傳輸
- 限制訪問頻率,失敗后不要無限重連
- 選用合適的定位服務(GPS定位,網路定位,被動定位)
- 使用快取
- startActivityForResult替代發送廣播
5)記憶體優化
- 回圈盡量不使用區域變數
- 避免在onDraw中創建物件,onDraw會被頻繁呼叫,容易造成記憶體抖動,回圈中創建大的物件,也是如此,
- 不用的物件及時釋放
- 資料庫的cursor及時關閉
- adapter使用快取
- 注冊廣播后,在生命周期結束時反注冊
- 及時關閉流操作
- 圖片盡量使用軟參考,較大的圖片可以通過 bitmapFactory 縮放后再使用,并及時recycler,另外加載巨圖時不要 使用 setImageBitmap 或 setImageResourse 或BitmapFactory.decodeResource,這些方法拿到的都是 bitmap 的物件,占用記憶體較大,可以用 BitmapFactory.decodeStream 方法配合 BitmapFactory.Options 進行縮放,
- 避免 static 成員變數參考資源耗費過多實體
- 避免靜態內部類的參考
面試題二:一般什么情況下會導致記憶體泄漏問題?
- 資源物件沒關閉造成的記憶體泄漏(如: Cursor、File 等)
- Bitmap 物件不在使用時呼叫 recycle() 釋放記憶體
- 集合中物件沒清理造成的記憶體泄漏(特別是 static 修飾的集合)
- 接收器、監聽器注冊沒取消造成的記憶體泄漏
- Activity 的 Context 造成的泄漏,可以使用 ApplicationContext
- Handler 造成的記憶體泄漏問題(一般由于 Handler 生命周期比其外部類的生命周期長引起的)
面試題三:自定義 Handler 時如何有效地避免記憶體泄漏問題?
- 自定義的靜態handler
- 可以加一個弱參考
- 還有一個主意的就是當你activity被銷毀的時候如果還有訊息沒有發出去就 remove 掉吧
- removecallbacksandmessages 去清除 Message 和 Runnable 加 null 寫在生命周的ondestroy() 就行
面試題四:哪些情況下會導致 OOM 問題?
- 例如 handler 在界面銷毀的時候訊息還未發送
- file 沒有關流
- 查詢到結果還沒有停止
- 內部類持有外部類參考得不到釋放
- 不用的物件最好 null 讓 GC 回收一下
- 圖片資源什么的最好加一個軟參考
面試題五:ANR 出現的場景以及解決方案?
在Android中,應用的回應性被活動管理器(Activity Manager)和視窗管理(Window Manager)這兩個系統服務所監視,當用戶觸發了輸入事件(如鍵盤輸入,點擊按鈕等),如果應用5秒內沒有回應用戶的輸入事件,那么,Android會認為該應用無回應,便彈出ANR對話框,而彈出ANR例外,也主要是為了提升用戶體驗,
解決方案是對于耗時的操作,比如訪問網路、訪問資料庫等操作,需要開辟子執行緒,在子執行緒處理耗時的操作,主執行緒主要實作UI的操作,
面試題六:談談 Android 中記憶體優化的方式?
關于記憶體泄漏,一般像單例模式的使用不當啊、集合的操作不當啊、資源的缺乏有效的回識訓制啊、Handler、執行緒的使用不當等等都有可能引發記憶體泄漏,
1)單例模式引發的記憶體泄漏:
- 原因:單例模式里的靜態實體持有物件的參考,導致物件無法被回收,常見為持有Activity的參考
- 優化:改為持有Application的參考,或者不持有使用的時候傳遞,
2)集合操作不當引發的記憶體泄漏:
- 原因:集合只增不減
- 優化:有對應的洗掉或卸載操作
3)執行緒的操作不當引發的記憶體泄漏:
- 原因:執行緒持有物件的參考在后臺執行,與物件的生命周期不一致
- 優化:靜態實體+弱參考(WeakReference)方式,使其生命周期一致
4)匿名內部類/非靜態內部類操作不當引發的記憶體泄漏:
- 原因:內部類持有物件參考,導致無法釋放,比如各種回呼
- 優化:保持生命周期一致,改為靜態實體+物件的弱參考方式(WeakReference)
5)常用的資源未關倍訓收引發的記憶體泄漏:
- 原因:BroadcastReceiver,File,Cursor,IO流,Bitmap等資源使用未關閉
- 優化:使用后有對應的關閉和卸載機制
6)Handler 使用不當造成的記憶體泄漏:
- 原因:Handler持有Activity的參考,其發送的 Message 中持有 Handler 的參考,當佇列處理 Message 的時間過長會導致 Handler 無法被回收
- 優化:靜態實體+弱參考(WeakReference)方式
7)記憶體溢位:
- 原因:記憶體泄漏長時間的積累;業務操作使用超大記憶體;
- 優化:調整影像大小后再放入記憶體、及時回收;不要過多的創建靜態變數;
更多 Android 中高級面試題
如果說求職是人生的一座山,那面試就是最難跨越的一道溝,有時候好不容易被通知去面試,結果被面試官虐得體無完膚,這里分享一份《2022中高級 Android 面試必知百題》,資料整體包括 Java 方面,Android 方面,kotlin方面,希望能給大家面試提供一些幫助,
第一章:Java 部分
- Java基礎部分
- Java合集
- Java多執行緒
- Java虛擬機

第二章:Android 方面
- Android 四大組件相關
- Android 異步任務和訊息機制
- Android UI 繪制相關
- Android 性能調優相關
- Android 中的 IPC
- Android 系統 SDK 相關

- 第三方框架分析
- 綜合技術
- 資料結構方面
- 設計模式
- 計算機網路方面
- Kotlin方面

由于篇幅有限,這里只展示了面試題和部分內容截圖,需要完整版《2022中高級 Android 面試必知百題》的朋友可以掃描下方【CSDN官方認證二維碼】免費領取!

轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/404386.html
標籤:其他
上一篇:做Android開發的至暗時刻,我一直在尋求更好的出路
下一篇:Android開發環境搭建

