前言
作爲一個有兩、三年Android應用開發經驗的碼農,自然會遇到很多坑,下面是我能夠想起的一些坑(實踐證明不記筆記可不是個好習慣),後面有想到其它坑會陸續補上。
此文純粹總結開發Android以來遇到的一些坑,一來爲了防止再次掉坑,二來是希望後面的朋友能躲開這些坑。
開發中那些可能會遇到的坑
1、不要排斥新技術和新工具
Android Studio 3.5 之後的版本,基本已經穩定到可以支持正常的工作開發的程度了。單純就書寫效率而言,Android Studio 帶來的好處絕對大於它和Gradle的學習成本。JetBrains的IDE,用過都說好。
還有就是適當的提升targetSdkVersion到新版本。
2、代碼設計方面的問題,大部分都能在Android系統源碼裏找到解決方案
當你想設計一個新模塊,或者實現一個新ui組件的時候,應該採用哪些設計模式、應該以哪種形式給外界提供接口之類的問題,大部分都可以參考Android系統的源碼,找到實現方式。Google爲安卓程序員提供了一座現成的寶庫。
3、理解Android和Java內存管理方式,至少要理解垃圾回收和Java的引用
就好比學OC就要先理解黃金法則一樣,而java的內存管理,其實比OC要好理解多了。 這可能會幫助你大大減少程序異步操作產生的空指針崩潰。也會幫助你理解爲什麼濫用單例模式會導致內存的臃腫。還會幫助你養成不用“+”去連接超大字符串的好習慣。
4、ContentProvider並不是只有在跨進程共享數據的纔有用,把數據庫表映射到一個獨立的uri是Google鼓勵的實現方式
從設計上講,用uri(統一資源標識符)去描述數據,肯定比sql語句要理想。從效果上講,用CursorLoader讀取數據是讓iOS程序員都羨慕不已的事情,作爲android程序員,何苦不用呢。
5、理解Activity任務棧
非Activity的Context對象如果直接啓動Activity會報錯,這只是一個表面現象,真正起作用的其實是Activity任務棧機制。
理解Activity任務棧機制以及Activity的各種啓動方式,會幫助解決大部分頁面關係錯亂問題,以及應用互相掉起、任務欄進入應用、後臺彈窗引起的各種問題。
6、對於一些奇葩的第三方ROM,調用其非主流api的時候,可以使用反射
在適配一些第三方ROM的的時候,調用一些在開發環境中沒有,但在運行環境中有的方法時,可以使用反射。比方說,華爲雙卡手機可能會提供獲取第二塊SIM卡信息的api,如果直接調用,在開發環境可能無法通過正常編譯,用反射就沒問題。這屬於不得已而用反射的一種情況。
7、SQLite的鎖,是數據庫級別的鎖,也就是說同一個數據庫的寫操作無法併發執行
所以,在數據庫設計的時候,如果表太多,儘量將沒有關聯的表拆到多個數據庫文件中。
8、Bitmap的內存佔用問題
這是一個困擾2.X時代android程序員的問題。
2.X時代Bitmap對象雖然存儲在堆內存中,但是用了一個byte數組存儲其像素信息。通過計數器來記錄該像素信息被引用的個數。有人認爲這個byte數組在native堆中,但事實上它也在堆中。
只有在使用者調用recycle()後,Bitmap對象纔會釋放像素信息,纔會在失去引用後,被垃圾回收機制銷燬。再加上DVM的heap size有嚴格的閥值,所以在使用大量圖片資源的時候,及其容易發生OOM。
解決辦法一般都是,用一個哈希表存儲Bitmap對象的軟引用,作爲內存緩存,並在適當時機掉用其recycle()。
3.0以上版本Bitmap對象可以通過垃圾回收機制完全銷燬,理論上不用再調用recycle()。
之前遇到過的坑
說幾個之前遇到過的坑(大神們輕笑):
1、假使AActivity已經啓動(對應的啓動Intent爲intent1),此時調用startActivity(intent2)再次啓動AActivity,在onResume()中調用getIntent()獲取到的Intent仍然是intent1,除非重寫onNewIntent()方法:
2、ViewPager的子控件個數(getChildCount())最多爲3(默認setOffscreenPageLimit(1),在destroyItem()中調用了removeView()),如果要獲取ViewPager某個子頁面,千萬不能使用getChildAt(position),會造成數組越界。可以通過:
來獲取。
3、自定義View爲內部類時,如果需要在xml文件中使用,該View必須爲靜態內部類,當然這不是重點,重點是xml中必須使用view作爲節點:
4、使用屬性動畫(Property Animation)中的位移類動畫時,對layout根節點的控件(ll_outer)無效:
5、HONEYCOMB以上使用混合渲染器ComposeShader無效,可能和硬件加速有關,使用drawable設置的虛線效果無效也可能是硬件加速的原因。
6、使用hide()與show()來切換Fragment時,Fragment的生命週期方法都不會被調用,除了onHiddenChanged()。
7、自定義SeekBar thumb的問題,代碼如下:
android:thumb="@drawable/sb_thumb"
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/sb_thumb_disabled" android:state_enabled="false" />
<item android:drawable="@drawable/sb_thumb_pressed" android:state_pressed="true" />
<item android:drawable="@drawable/sb_thumb_focused" android:state_selected="true" />
<item android:drawable="@drawable/sb_thumb_normal" />
</selector>
但是效果是這樣的:
需要計算thumbOffset大小並設置才能正常顯示。
8、CheckBox設置文本時的顯示問題,我就傳幾張圖不說話,呵呵……
9、使用MediaPlayer播放網絡視頻時,如果網絡不好會一直加載,點擊返回可能ANR、鎖屏可能ANR、隨意拖動進度條也可能ANR,不得不說Android媒體這一塊做的實在不夠好。
10、默認一個應用對應一個進程,在AndroidManifest.xml文件中給組件添加android:process屬性後(比如友盟推送:android:process=":push"),應用會對應多個進程,Application會被創建多次,此時內存中的數據都不能共享(即便是靜態的成員)。
11、Fragment千萬不能設置成非靜態內部類,因爲Activity恢復狀態時會通過反射的方法實例化Fragment。
最後
如果你的知識是一個圓,當你的圓越大時,圓外面的世界也就越大。
如果你不知道怎麼學習,我給大家提供一個方向,進行體系化的學習!
除了上面的學習路線,還給大家整理了一份Android進階學習資料,主要爲安卓相關知識點及面試資料爲主,在這個PDF中,通過詳解各大互聯網公司的 Android 常見面試題爲主線,從面試的角度帶你介紹必備知識點,以及該知識點在項目中的實際應用。
幫你在現在的基礎上,重新梳理和建立 Android 開發的知識體系。無論是你短期內想提升 Android 內功實力,突破自己工作中的能力瓶頸,還是準備參加 Android 面試,都會在這個PDF中有所收穫。一些基礎不好的,這裏也有一份安卓基礎資料包,幫助鞏固基礎。
以下是這份PDF主要內容:
- Android 核心技術:介紹 Android 開發中常用的核心技術,比如自定義 View、Handler,以及一些開源框架的原理實現,來夯實你的底層能力。只有底層能力足夠出色,之後的進階之路纔會更加輕鬆。
- 常見問題剖析:介紹一些項目中常見的疑難問題,使你能夠對現有項目做出合理的重構優化。
知識梳理完之後,就需要進行查漏補缺,所以針對這些知識點,我手頭上也準備了不少的電子書和筆記,這些筆記將各個知識點進行了完美的總結。
這裏附上針對字節跳動的面試題整理的合集,我們進行了分類,循序漸進,由基礎到深入,由易到簡。
將內容整理成了五個章節:
計算機基礎面試題、數據結構和算法面試題、Java面試題、Android面試題、其他擴展面試題、非技術面試題總共五個章節354頁。
還有一份Android開發相關源碼解析,這份Android學習PDF大全真的包含了方方面面了
內含微信 MMKV 源碼、AsyncTask 源碼、Volley 源碼、Retrofit源碼、OkHttp 源碼等等486頁超全面Android開發相關源碼精編解析
字節跳動真題解析、Android開發相關源碼解析、簡歷模板可以【簡信】我免費獲取
面試時HR也是不可以忽略的環節,我們經常也會遇到很多關於簡歷製作,職業困惑、HR經典面試問題回答等有關面試的問題。
有全套簡歷製作、春招困惑、HR面試等問題解析參考建議。
這些都是我閒暇還會反覆翻閱的精品資料。可以有效的幫助大家掌握知識、理解原理。當然你也可以拿去查漏補缺,提升自身的競爭力。
資料太多,全部展示會影響篇幅,暫時就先列舉這些部分截圖,以上資源均免費分享,以上內容均放在了開源項目:【github】中已收錄,大家可以自行獲取(或者關注主頁掃描加微信獲取)。
一些心裏話
隨着年齡的增長意味着我們的時間也越來越少了,所以我們自己心裏要明白自己該做什麼?
渾渾噩噩,最後自己只會被淘汰。
當然,我們程序員,最大的底氣就是技術!
所以,如果你只想在技術這條路上越走越遠,一定要進階,邁上一個高的臺階!
希望我們在開發的路上越走越遠,一起來進階吧。
偏執的我們可能不一定能夠總是被理解,但是我們總是能夠創造我們的價值。