Android 日常開發總結的技術經驗

hunhun1122發表於2016-09-06

1. 全部 Activity 可繼承自 BaseActivity,便於統一風格與處理公共事件,構建對話方塊統一構建器的建立,萬一需要整體變動,一處修改到處有效。
2. 資料庫表段欄位常量和 SQL 邏輯分離,更清晰,建議使用 Lite 系列框架 LiteOrm 庫,超級清晰且重心可以放在業務上不用關心資料庫細節。
3. 全域性變數放全域性類中,模組私有放自己的管理類中,讓常量清晰且集中.
4. 不要相信龐大的管理類的東西會帶來什麼好處,可能是一場災難,而要時刻注意單一職責原則,一個類專心做好一件事情更為清晰。

5. 如果資料沒有必要載入,資料請務必延遲初始化,謹記為使用者節省記憶體,總不會有壞處。

6. 異常丟擲,在合適的位置處理或者集中處理,不要搞的到處是 catch,混亂且效能低,儘量不要在迴圈體中捕獲異常,以提升效能。

7. 地址引用鏈長時(3 個以上指向)小心記憶體洩漏,和警惕堆疊地址指向,典型的易發事件是:資料更新了,ListView 檢視卻沒有重新整理,

這時 Adapter 很可能指向並的並不是你更新的資料容器地址(一般為 List)。

8. 資訊同步:不管是資料庫還是網網路操作,新插入的資料注意返回 ID(如果沒有賦予唯一 ID),否則相當於沒有同步。
9. 多執行緒運算元據庫時,db 關閉了會報錯,也很可能出現互鎖的問題,推薦使用事務,推薦使用自動化的 LiteOrm 庫操作。
10. 做之前先考慮那些可以公用,資源,layout,類,做一個結構、架構分析以加快開發,提升程式碼可複用度。
11. 有序佇列操作 add、delete 操作時注意保持排序,否則你會比較難堪喔。
12. 資料庫刪除資料時,要注意級聯操作避免出現永遠刪不掉的髒資料喔。
13. 關於形參實參:呼叫函式時引數為基本型別傳的是值,即傳值;引數為物件傳遞的是引用,即傳址。
14. listview 在資料未滿一屏時,setSelection 函式不起作用;ListView 批量操作時各子項和檢視正確對應,可見即所選。
15 控制 Activity 的程式碼量,保持主要邏輯清晰。其他類遵守 SRP(單一職能),ISP(介面隔離)原則。
16. arraylist 執行 remove 時注意移除 int 和 Integer 的區別。你懂得。
17. Log 請打上 Tag,除錯列印一定要做標記,能定位列印位置,否則尷尬是:不知道是哪裡在列印。
18. 碼塊/常量/資源可以集中公用的一定共用,即使共用邏輯稍複雜一點也會值得,修改起來很輕鬆,修改一種,到處有效。

19. setSelection 不起作用,嘗試 smoothScrollToPosition。ListView 的 LastVisiblePosition(最後一個可見子項)會隨著 getView 

方法執行位置不同變動而變。

20. 與 Activity 通訊使用 Handler 更方便; 如果你的框架回撥鏈變長,考慮監聽者模式簡化回撥。
21. 監聽者模式不方便使用時,推薦 EventBus 框架庫,使用時間匯流排,沒接觸過的同學可以自行腦補一下哦。
22. Handler 在子執行緒執行緒使用 Looper.prepare,或者 new 的時候給建構函式傳入 MainLooper 來確保在主執行緒 run。
23. timepicker 點選確定後需要 clearFocus 才能獲取手動輸入的時間。
24. 建構函式裡面極度不推薦啟動非同步執行緒,會埋下隱患。比如:非同步執行緒呼叫了本例的示例,就會悲劇等著崩潰吧。
25. 千萬不要理所當然的以為一個物件不會為空,充分的做好容錯處理;另外注意 null 也可以插入 ArrayList 等容器中。
26. ExpandableListView 的子列表不能點選(禁用)要把 Adapter 的 isChildSelectable 方法返回 true。
27. UI 顯示注意內容過長的情形要提前使用 ScrollView 否則在小手機上尷尬你懂得。
28. 注意按鈕的感應範圍不小於 9mm 否則不易點選;輸入框注意游標的位置更易使用者輸入。
29. 伺服器和客戶端儘量統一唯一標識(有可能是 ID),否則多少會有歧義和問題。
30. 註釋,儘量去寫足夠的註釋,去描述一下思路,達到看了可以明白某一塊程式碼的效果。

31. 完整型資料一定要用 Sqlite 的 Transaction,大資料一定要用。粗略測試插入 100 個資料有 20 倍的提速,插入 1000 個資料就有

 100 多倍的提速。

32. 避免 String=”null”的情況出現 String = null,=””都可以。避免出現 title=”無主題”這樣的資料提交到資料庫浪費空間。

33. 存在多個不同的 dbhelper 例項情況下,sqlitedatabase 物件必然存在不同的例項,多執行緒同時寫入資料,輪流寫入資料時會不定時

的報 db is locked,引起崩潰,不管是操作同張表還是異表。讀和寫可以同時併發,輪流無規律的交替執行。同時寫入資料時解決方案是

用併發的每個執行緒都用事 務,db 則不會 lock,按次整體寫入。

34. 建議整個應用維護一個 dbhelper 例項,只要 db 沒有關閉,全域性就只有一個 db 例項,多執行緒併發寫入 db 不會 lock,嚴格交替進行

寫入:123123123。。。(123 代表不同執行緒,輪流插入一個記錄),讀和寫均不會鎖住 db,讀寫交替並沒有規律,執行次數和程度看

 cpu 分配給哪個執行緒的時間片長。

35. 一個任務使用事務巢狀N個事務,N個事務中有一個失敗,這個任務整體失敗,全部成功後,資料才寫入,具有安全性,整體性。並且

事務寫入大批量資料的效率經 實際測試成百上千倍的高於一般的單個寫入。資料庫大量資料、多執行緒操作建議使用 LiteOrm 資料庫框架,

更穩定簡單。

36. 經常需要用 ListView 或者其它顯示大量 Items 的控制元件實時跟蹤或者檢視資訊,並且希望最新的條目可以自動滾動到可視範圍內。通過

設定的控制元件 transcriptMode 屬性可以將 Android 平臺的控制元件(支援 ScrollBar)自動滑動到最底部。

37. Long a; 判斷a有沒有賦值,if (a == 0) 在a沒有賦值情況下會報錯。應該 if (a == null),Integer、Floag 等也一樣,原因你懂,只是提

醒你要小心喔。

38. 編碼遇到讀寫、出入等邏輯要雙向考慮,檔案匯入匯出,字元位元組相互轉換都要兩邊轉碼。

39. 一個 int 值與一個 Integer 物件(能包含 int 值的最小物件)的大小比率約為 1:4(32 位和 64 位機器有不同)。額外的開銷源於 JVM 

用於描述 Java 物件的後設資料也就是 Integer,(Long、Double 等也是)。

40. 物件由後設資料和資料組成。後設資料包括類(指向類的指標,描述了類的型別),標記(描述了物件狀態,如雜湊碼、形狀等),鎖

(物件同步資訊)。陣列物件還包括大小的後設資料。

41. 一個在 32 位 Java 執行時中使用 1GB  Java 堆的 Java 應用程式在遷移到 64 位 Java 執行時之後,通常需要使用 1.7GB 的 Java 堆。

42. Hash 集合的訪問效能比任何 List 的效能都要高,但每條目的成本也要更高。由於訪問效能方面的原因,如果您正在建立大集合(例如,

用於實現快取),那麼最好使用基於 Hash 的集合,而不必考慮額外的開銷。

43. 對於並不那麼注重訪問效能的較小集合而言,List 則是合理的選擇。ArrayList 和 LinkedList 集合的效能大體相同,但其記憶體佔用完全

不同:ArrayList 的每條目大小要比 LinkedList 小得多,但它不是準確設定大小的。List 要使用的正確實現是 ArrayList 還是 LinkedList 取

決於 List 長度的可預測性。如果長度未知,那麼正確的選擇可能是 LinkedList,因為集合包含的空白空間更少。如果大小已知或可預知或

比較小,那麼 ArrayList 的記憶體開銷會更低一些。

43. 選擇正確的集合型別使你能夠在集合效能與記憶體佔用之間達到合理的平衡。除此之外,你可以通過正確調整集合大小來最大化填充率、

最小化未得到利用的空間,從而最大限度地減少記憶體佔用。

44. 充分利用封裝(提供介面類來控制訪問資料)和委託(helper 物件來實施任務)兩種理念。

45. 延遲分配 Hashtable:如果 Hashtable 為空是經常發生的普遍現象,那麼僅在存在需要儲存的資料時分配 Hashtable 應該是一種合理

的做法。將 Hashtable 分配為準確的大小:雖然會有預設大小,但建議使用更為準確的初始大小。

46. EditText 在 setText 時不要忘記是否需要 setSelection。在大多數情況下是需要設定的。
47. XML 兩種情況要注意:1 屬性名字時候有重複;2 注意文字是否包含非法字元,注意使用 CDATA 包裹。
48. 當邏輯沒有明顯問題時考慮物件屬性、函式引數、網路傳輸引數是否全部瞭解,是否設定正確。
49. 當出現編譯或者執行時錯誤,別人那沒問題時,考慮你的編譯環境和環境版本是否有問題。

50. 由於 String 類的 immutable 性質,當 String 變數需要經常變換其值時,應該考慮使用 StringBuilder 提升效能,多執行緒使用 StringBuffer 

操作 string 提高程式效率。

51. java 棧的優勢是比堆速度快,可共享,主要存放臨時變數、引數等,堆的優勢是可動態分配記憶體大小。
52. 只要是用 new ()來新建物件的,都會在堆中建立,而且其資料是單獨存值的,即使與棧中的資料(值)相同,也不會與棧中的資料共享。
53. 基本資料型別定義的變數稱自動變數,存的是‘字面值’,存在於棧中,可共享(存在即不新建)。

54. 多個 RandomAccessFile 物件指向同一個檔案,可使用多個執行緒一起寫入無需再自己加鎖,經試驗結論:三個執行緒分別寫入 100 萬次

資料,使用鎖約 12 秒,不使用約 8.5 秒。100 個執行緒分別寫入 1 萬次資料使用鎖耗時約 4.2 秒,不使用鎖耗時約 3 秒。

55. XmlPullParser 解析慎用 nextText ()方法,xml 比較複雜,含有空標籤、重複名字標籤時容易出現異常問題;TEXT 中使用 getText ()方法

代替 START_TAG 中使用 nextText ()方法;START_TAG,TEXT,END_TAG 三個事件配合使用。注意每個 xml 節點之間(不管是開始節

點還是結束節點)都會出現 TEXT 事件。

56. 改變邏輯的時候考慮全部用到這項功能的地方,分散的地方多了,容易大意。

57. 當系統原生元件出現問題時,檢視錯誤棧資訊,自己寫一個該元件的子類,並在合適的地方將出錯方法複寫一下,加上 try catch 保證不

崩潰掉。不要擾亂了該系統控制元件的正常邏輯。

58. 輸入控制元件注意對空格、換行等符號的控制;輸入框裡內容注意和左右控制元件的空間,防止誤點選。
59. 注意函式引數裡的++或者–操作。是++c 還是 c++,區別很大。
60. 各種地方、永遠的不要小看 null 指標問題,甚至有些場合寧可錯殺(try catch),不可放過。

相關文章