Android開發技術總結!五年Android開發者小米、阿里面經,附面試題答案
寫在開頭:
說下我的經歷吧。湖南大學畢業,學的是軟體工程,那時候比較貪玩,專業知識學的不是很紮實,畢業後就在長沙本地找了家網際網路公司工作了。
到今年六月份的話剛好畢業了五年了,同期和我一起出來的同學們,大多都已經是專案經理了,至少也是個專案組長了,而我還是個普通的程式設計師,日復一日的敲著程式碼。
年初爆發了新冠疫情,居家隔離。市場經濟也進入了寒冬,大批的企業都是搖搖欲墜,也包括我的公司。這時,我才意識到。進大廠,是多麼的重要。
記憶體洩漏是什麼?
記憶體洩漏即 ML (Memory Leak)
指 程式在申請記憶體後,當該記憶體不需再使用 但 卻無法被釋放 & 歸還給 程式的現象
記憶體洩漏有哪些情況,對應的解決方案?
記憶體洩漏的原因歸根到底就是當需要被回收變數的記憶體被其他變數引用持有,導致記憶體回收失敗
常見的原因有:
1.非靜態內部類/匿名類
-
原因1:
非靜態內部類/匿名類 Handler
持有外部的Activity/Fragment
物件的引用,導致Activity/Fragemnt
被銷燬的時候沒有被回收 -
解決方案:
- 將Handler類改為靜態內部類 + 弱引用(
WeakReference
)持有Activity
引用(靜態類預設不持有外部的引用) - 當外部類(一般是
Activity/Fragment
)結束生命週期時,清空Handler佇列
- 將Handler類改為靜態內部類 + 弱引用(
-
原因2:
非靜態內部類的例項(物件)
=靜態例項
(其生命週期 = 應用的生命週期) -
解決方案:
- 將該類改為靜態類(靜態類預設不持有外部的引用)
- 將該類抽出來封裝成為一個單例
-
原因3:多執行緒 工作執行緒正在處理任務時外部類需要銷燬,此時工作執行緒持有外部類的引用導致無法被回收
-
解決方案:
- 將該執行緒類類改為靜態類(靜態類預設不持有外部的引用)
- 當外部類結束生命週期時強制結束執行緒
2.集合類
-
原因:集合類新增元素之後持有集合元素的引用,導致該集合元素不可被回收,導致記憶體洩漏
-
解決方案:
- 集合類使用完元素物件後,必須將該元素從集合中刪除(由於一個集合中有多個元素,所以最簡單的方案就是清空集合物件(clean)&設定為Null)
3.資源物件使用後未關閉
-
原因:資源物件使用後未關閉,在Activity/Fragemnt銷燬時沒有關閉/登出這些資源,將導致無法回收 例如:
廣播BraodcastReceiver
、檔案流Fire
、圖片資源Bitmap
、資料庫遊標
等 -
解決方案:
Activity
銷燬時及時關閉/登出資源
4.Static關鍵字修飾成員變數
-
原因:Static關鍵字修飾成員變數的生命週期 = 應用的生命週期 例如
private static Context mContext = context
那麼context上下文對應的Activity
則無法被回收 -
解決方案:
- 儘量不要使用Static成員變數引用,使用弱引用代替強引用
- 使用單例模式
4.其他使用
-
原因1:Context:當擁有
Activity context
的引用的物件仍在使用,則該Activity
需要銷燬時無法回收 -
解決方案:
- 對
context
的引用不要超過它的生命週期 - 使用
ApplicationContext
代替
- 對
-
原因2:WebView:不再使用WebView物件後沒有及時銷燬,導致記憶體佔用
-
解決方案:
- 通過多執行緒對不再使用的
WebView
物件進行銷燬
- 通過多執行緒對不再使用的
-
原因3:Adapter:滑動ListView、RecycleView獲取新View時 都在getView()中重新例項化一個View物件,浪費資源,使記憶體佔用越來越大
-
解決方案:
- 使用快取的
convertView
- 直接使用
ViewHolder
- 使用快取的
要如何成為Android架構師?
搭建自己的知識框架,全面提升自己的技術體系,並且往底層原始碼方向深入鑽研。
大多數技術人喜歡用思維腦圖來構建自己的知識體系,一目瞭然。這裡給大家分享一份大廠主流的Android架構師技術體系,可以用來搭建自己的知識框架,或者查漏補缺;
對應這份技術大綱,我也整理了一套Android高階架構師完整系列的視訊教程,主要針對3-5年Android開發經驗以上,需要往高階架構師層次學習提升的同學,在這裡點選GitHub免費分享,希望能幫你突破瓶頸,跳槽進大廠;
最後我必須強調幾點:
1.搭建知識框架可不是說你整理好要學習的知識順序,然後看一遍理解了能複製貼上就夠了,大多都是需要你自己讀懂原始碼和原理,能自己手寫出來的。
2.學習的時候你一定要多看多練幾遍,把知識才吃透,還要記筆記,這些很重要! 最後你達到什麼水平取決你消化了多少知識
3.最終你的知識框架應該是一個完善的,兼顧廣度和深度的技術體系。然後經過多次專案實戰積累經驗,你才能達到高階架構師的層次。
你只需要按照在這個大的框架去填充自己,年薪40W一定不是終點,技術無止境