溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

60條Android開發(fā)注意事項(xiàng)與經(jīng)驗(yàn)總結(jié)

發(fā)布時(shí)間:2020-10-07 21:48:14 來源:腳本之家 閱讀:125 作者:wdc 欄目:移動(dòng)開發(fā)

1. 全部Activity可繼承自BaseActivity,便于統(tǒng)一風(fēng)格與處理公共事件,構(gòu)建對(duì)話框統(tǒng)一構(gòu)建器的建立,萬一需要整體變動(dòng),一處修改到處有效。

2.數(shù)據(jù)庫表段字段常量和SQL邏輯分離,更清晰,建議使用Lite系列框架LiteOrm庫,超級(jí)清晰且重心可以放在業(yè)務(wù)上不用關(guān)心數(shù)據(jù)庫細(xì)節(jié)。

3. 全局變量放全局類中,模塊私有放自己的管理類中,讓常量清晰且集中.

4. 不要相信龐大的管理類的東西會(huì)帶來什么好處,可能是一場災(zāi)難,而要時(shí)刻注意單一職責(zé)原則,一個(gè)類專心做好一件事情更為清晰。

5. 如果數(shù)據(jù)沒有必要加載,數(shù)據(jù)請(qǐng)務(wù)必延遲初始化,謹(jǐn)記為用戶節(jié)省內(nèi)存,總不會(huì)有壞處。

6. 異常拋出,在合適的位置處理或者集中處理,不要搞的到處是catch,混亂且性能低,盡量不要在循環(huán)體中捕獲異常,以提升性能。

7. 地址引用鏈長時(shí)(3個(gè)以上指向)小心內(nèi)存泄漏,和警惕堆棧地址指向,典型的易發(fā)事件是:數(shù)據(jù)更新了,ListView視圖卻沒有刷新,這時(shí)Adapter很可能指向并的并不是你更新的數(shù)據(jù)容器地址(一般為List)。

8.信息同步:不管是數(shù)據(jù)庫還是網(wǎng)網(wǎng)絡(luò)操作,新插入的數(shù)據(jù)注意返回ID(如果沒有賦予唯一ID),否則相當(dāng)于沒有同步。

9.多線程操作數(shù)據(jù)庫時(shí),db關(guān)閉了會(huì)報(bào)錯(cuò),也很可能出現(xiàn)互鎖的問題,推薦使用事務(wù),推薦使用自動(dòng)化的LiteOrm庫操作。

10.做之前先考慮那些可以公用,資源,layout,類,做一個(gè)結(jié)構(gòu)、架構(gòu)分析以加快開發(fā),提升代碼可復(fù)用度。

11. 有序隊(duì)列操作add、delete操作時(shí)注意保持排序,否則你會(huì)比較難堪喔。

12. 數(shù)據(jù)庫刪除數(shù)據(jù)時(shí),要注意級(jí)聯(lián)操作避免出現(xiàn)永遠(yuǎn)刪不掉的臟數(shù)據(jù)喔。

13. 關(guān)于形參實(shí)參:調(diào)用函數(shù)時(shí)參數(shù)為基本類型傳的是值,即傳值;參數(shù)為對(duì)象傳遞的是引用,即傳址。

14. listview在數(shù)據(jù)未滿一屏?xí)r,setSelection函數(shù)不起作用;ListView批量操作時(shí)各子項(xiàng)和視圖正確對(duì)應(yīng),可見即所選。

15 控制Activity的代碼量,保持主要邏輯清晰。其他類遵守SRP(單一職能),ISP(接口隔離)原則。

16. arraylist執(zhí)行remove時(shí)注意移除int和Integer的區(qū)別。你懂得。

17. Log請(qǐng)打上Tag,調(diào)試打印一定要做標(biāo)記,能定位打印位置,否則尷尬是:不知道是哪里在打印。

18. 碼塊/常量/資源可以集中公用的一定共用,即使共用邏輯稍復(fù)雜一點(diǎn)也會(huì)值得,修改起來很輕松,修改一種,到處有效。

19. setSelection不起作用,嘗試smoothScrollToPosition。ListView的LastVisiblePosition(最后一個(gè)可見子項(xiàng))會(huì)隨著getView方法執(zhí)行位置不同變動(dòng)而變。

20.與Activity通訊使用Handler更方便; 如果你的框架回調(diào)鏈變長,考慮監(jiān)聽者模式簡化回調(diào)。

21.監(jiān)聽者模式不方便使用時(shí),推薦EventBus框架庫,使用時(shí)間總線,沒接觸過的同學(xué)可以自行腦補(bǔ)一下哦。

22. Handler在子線程線程使用Looper.prepare,或者new的時(shí)候給構(gòu)造函數(shù)傳入MainLooper來確保在主線程run。

23. timepicker 點(diǎn)擊確定后需要clearFocus才能獲取手動(dòng)輸入的時(shí)間。

24. 構(gòu)造函數(shù)里面極度不推薦啟動(dòng)異步線程,會(huì)埋下隱患。比如:異步線程調(diào)用了本例的示例,就會(huì)悲劇等著崩潰吧。

25. 千萬不要理所當(dāng)然的以為一個(gè)對(duì)象不會(huì)為空,充分的做好容錯(cuò)處理;另外注意null也可以插入ArrayList等容器中。

26. ExpandableListView的子列表不能點(diǎn)擊(禁用)要把Adapter的isChildSelectable方法返回true。

27. UI顯示注意內(nèi)容過長的情形要提前使用ScrollView否則在小手機(jī)上尷尬你懂得。

28. 注意按鈕的感應(yīng)范圍不小于9mm否則不易點(diǎn)擊;輸入框注意光標(biāo)的位置更易用戶輸入。

29. 服務(wù)器和客戶端盡量統(tǒng)一唯一標(biāo)識(shí)(有可能是ID),否則多少會(huì)有歧義和問題。

30. 注釋,盡量去寫足夠的注釋,去描述一下思路,達(dá)到看了可以明白某一塊代碼的效果。

31. 完整型數(shù)據(jù)一定要用Sqlite的Transaction,大數(shù)據(jù)一定要用。粗略測試插入100個(gè)數(shù)據(jù)有20倍的提速,插入1000個(gè)數(shù)據(jù)就有100多倍的提速。

32. 避免String=”null”的情況出現(xiàn)String = null,=””都可以。避免出現(xiàn)title=”無主題”這樣的數(shù)據(jù)提交到數(shù)據(jù)庫浪費(fèi)空間。

33. 存在多個(gè)不同的dbhelper實(shí)例情況下,sqlitedatabase對(duì)象必然存在不同的實(shí)例,多線程同時(shí)寫入數(shù)據(jù),輪流寫入數(shù)據(jù)時(shí)會(huì)不定時(shí)的報(bào)db is locked,引起崩潰,不管是操作同張表還是異表。讀和寫可以同時(shí)并發(fā),輪流無規(guī)律的交替執(zhí)行。同時(shí)寫入數(shù)據(jù)時(shí)解決方案是用并發(fā)的每個(gè)線程都用事務(wù),db則不會(huì)lock,按次整體寫入。

34. 建議整個(gè)應(yīng)用維護(hù)一個(gè)dbhelper實(shí)例,只要db沒有關(guān)閉,全局就只有一個(gè)db實(shí)例,多線程并發(fā)寫入db不會(huì)lock,嚴(yán)格交替進(jìn)行寫入:123123123。。。(123代表不同線程,輪流插入一個(gè)記錄),讀和寫均不會(huì)鎖住db,讀寫交替并沒有規(guī)律,執(zhí)行次數(shù)和程度看cpu分配給哪個(gè)線程的時(shí)間片長。

35. 一個(gè)任務(wù)使用事務(wù)嵌套N個(gè)事務(wù),N個(gè)事務(wù)中有一個(gè)失敗,這個(gè)任務(wù)整體失敗,全部成功后,數(shù)據(jù)才寫入,具有安全性,整體性。并且事務(wù)寫入大批量數(shù)據(jù)的效率經(jīng)實(shí)際測試成百上千倍的高于一般的單個(gè)寫入。數(shù)據(jù)庫大量數(shù)據(jù)、多線程操作建議使用LiteOrm數(shù)據(jù)庫框架,更穩(wěn)定簡單。

36. 經(jīng)常需要用ListView或者其它顯示大量Items的控件實(shí)時(shí)跟蹤或者查看信息,并且希望最新的條目可以自動(dòng)滾動(dòng)到可視范圍內(nèi)。通過設(shè)置的控件transcriptMode屬性可以將Android平臺(tái)的控件(支持ScrollBar)自動(dòng)滑動(dòng)到最底部。

37. Long a; 判斷a有沒有賦值,if(a == 0)在a沒有賦值情況下會(huì)報(bào)錯(cuò)。應(yīng)該if(a == null),Integer、Floag等也一樣,原因你懂,只是提醒你要小心喔。

38. 編碼遇到讀寫、出入等邏輯要雙向考慮,文件導(dǎo)入導(dǎo)出,字符字節(jié)相互轉(zhuǎn)換都要兩邊轉(zhuǎn)碼。

39. 一個(gè) int 值與一個(gè) Integer 對(duì)象(能包含 int 值的最小對(duì)象)的大小比率約為 1:4(32位和64位機(jī)器有不同)。額外的開銷源于 JVM 用于描述 Java 對(duì)象的元數(shù)據(jù)也就是 Integer,(Long、Double等也是)。

40. 對(duì)象由元數(shù)據(jù)和數(shù)據(jù)組成。元數(shù)據(jù)包括類(指向類的指針,描述了類的類型),標(biāo)記(描述了對(duì)象狀態(tài),如散列碼、形狀等),鎖(對(duì)象同步信息)。數(shù)組對(duì)象還包括大小的元數(shù)據(jù)。

41. 一個(gè)在 32 位 Java 運(yùn)行時(shí)中使用 1GB Java 堆的 Java 應(yīng)用程序在遷移到 64 位 Java 運(yùn)行時(shí)之后,通常需要使用 1.7GB 的 Java 堆。

42. Hash 集合的訪問性能比任何 List 的性能都要高,但每條目的成本也要更高。由于訪問性能方面的原因,如果您正在創(chuàng)建大集合(例如,用于實(shí)現(xiàn)緩存),那么最好使用基于 Hash 的集合,而不必考慮額外的開銷。

43. 對(duì)于并不那么注重訪問性能的較小集合而言,List 則是合理的選擇。ArrayList 和 LinkedList 集合的性能大體相同,但其內(nèi)存占用完全不同:ArrayList 的每條目大小要比 LinkedList 小得多,但它不是準(zhǔn)確設(shè)置大小的。List 要使用的正確實(shí)現(xiàn)是 ArrayList 還是 LinkedList 取決于 List 長度的可預(yù)測性。如果長度未知,那么正確的選擇可能是 LinkedList,因?yàn)榧习目瞻卓臻g更少。如果大小已知或可預(yù)知或比較小,那么 ArrayList 的內(nèi)存開銷會(huì)更低一些。

43. 選擇正確的集合類型使你能夠在集合性能與內(nèi)存占用之間達(dá)到合理的平衡。除此之外,你可以通過正確調(diào)整集合大小來最大化填充率、最小化未得到利用的空間,從而最大限度地減少內(nèi)存占用。

44. 充分利用封裝(提供接口類來控制訪問數(shù)據(jù))和委托(helper對(duì)象來實(shí)施任務(wù))兩種理念。

45. 延遲分配 Hashtable:如果 Hashtable 為空是經(jīng)常發(fā)生的普遍現(xiàn)象,那么僅在存在需要存儲(chǔ)的數(shù)據(jù)時(shí)分配 Hashtable 應(yīng)該是一種合理的做法。將 Hashtable 分配為準(zhǔn)確的大?。弘m然會(huì)有默認(rèn)大小,但建議使用更為準(zhǔn)確的初始大小。

46. EditText在setText時(shí)不要忘記是否需要setSelection。在大多數(shù)情況下是需要設(shè)置的。

47. XML兩種情況要注意:1 屬性名字時(shí)候有重復(fù);2 注意文本是否包含非法字符,注意使用CDATA包裹。

48. 當(dāng)邏輯沒有明顯問題時(shí)考慮對(duì)象屬性、函數(shù)參數(shù)、網(wǎng)絡(luò)傳輸參數(shù)是否全部了解,是否設(shè)置正確。

49. 當(dāng)出現(xiàn)編譯或者運(yùn)行時(shí)錯(cuò)誤,別人那沒問題時(shí),考慮你的編譯環(huán)境和環(huán)境版本是否有問題。

50. 由于String類的immutable性質(zhì),當(dāng)String變量需要經(jīng)常變換其值時(shí),應(yīng)該考慮使用StringBuilder提升性能,多線程使用StringBuffer操作string提高程序效率。

51. java 棧的優(yōu)勢是比堆速度快,可共享,主要存放臨時(shí)變量、參數(shù)等,堆的優(yōu)勢是可動(dòng)態(tài)分配內(nèi)存大小。

52. 只要是用new()來新建對(duì)象的,都會(huì)在堆中創(chuàng)建,而且其數(shù)據(jù)是單獨(dú)存值的,即使與棧中的數(shù)據(jù)(值)相同,也不會(huì)與棧中的數(shù)據(jù)共享。

53. 基本數(shù)據(jù)類型定義的變量稱自動(dòng)變量,存的是‘字面值',存在于棧中,可共享(存在即不新建)。

54. 多個(gè)RandomAccessFile對(duì)象指向同一個(gè)文件,可使用多個(gè)線程一起寫入無需再自己加鎖,經(jīng)試驗(yàn)結(jié)論:三個(gè)線程分別寫入100萬次數(shù)據(jù),使用鎖約12秒,不使用約8.5秒。100個(gè)線程分別寫入1萬次數(shù)據(jù)使用鎖耗時(shí)約4.2秒,不使用鎖耗時(shí)約3秒。

55. XmlPullParser解析慎用nextText()方法,xml比較復(fù)雜,含有空標(biāo)簽、重復(fù)名字標(biāo)簽時(shí)容易出現(xiàn)異常問題;TEXT中使用getText()方法代替START_TAG中使用nextText()方法;START_TAG,TEXT,END_TAG三個(gè)事件配合使用。注意每個(gè)xml節(jié)點(diǎn)之間(不管是開始節(jié)點(diǎn)還是結(jié)束節(jié)點(diǎn))都會(huì)出現(xiàn)TEXT事件。

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

57. 當(dāng)系統(tǒng)原生組件出現(xiàn)問題時(shí),查看錯(cuò)誤棧信息,自己寫一個(gè)該組件的子類,并在合適的地方將出錯(cuò)方法復(fù)寫一下,加上try catch保證不崩潰掉。不要擾亂了該系統(tǒng)控件的正常邏輯。

58. 輸入控件注意對(duì)空格、換行等符號(hào)的控制;輸入框里內(nèi)容注意和左右控件的空間,防止誤點(diǎn)擊。

59. 注意函數(shù)參數(shù)里的++或者–操作。是++c 還是 c++,區(qū)別很大。

60. 各種地方、永遠(yuǎn)的不要小看null指針問題,甚至有些場合寧可錯(cuò)殺(try catch),不可放過。

這60條開發(fā)注意事項(xiàng)與經(jīng)驗(yàn)是我們?cè)谌粘i_發(fā)工作中經(jīng)常會(huì)遇到的,大家一定要牢記

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI