Android 開發過程中,有哪些坑需要我們注意?

前言

作爲一個有兩、三年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】中已收錄,大家可以自行獲取(或者關注主頁掃描加微信獲取)。

一些心裏話

隨着年齡的增長意味着我們的時間也越來越少了,所以我們自己心裏要明白自己該做什麼?

渾渾噩噩,最後自己只會被淘汰。

當然,我們程序員,最大的底氣就是技術!

所以,如果你只想在技術這條路上越走越遠,一定要進階,邁上一個高的臺階!

希望我們在開發的路上越走越遠,一起來進階吧。

偏執的我們可能不一定能夠總是被理解,但是我們總是能夠創造我們的價值。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章