當前位置:首頁 > 安卓源碼 > 技術博客 >

Android開發中這60個需要注意的細節,你都注意到了嗎?

時間:2020-02-27 16:15 來源:互聯網 作者:源碼搜藏 瀏覽: 收藏 挑錯 推薦 打印

全部Activity可繼承自BaseActivity,便于統一風格與處理公共事件,構建對話框統一構建器的建立,萬一需要整體變動,一處修改到處有效。 數據庫表段字段常量和SQL邏輯分離,更清晰,建議使用Lite系列框架LiteOrm庫,超級清晰且重心可以放在業務上不用關心數據
  • 全部Activity可繼承自BaseActivity,便于統一風格與處理公共事件,構建對話框統一構建器的建立,萬一需要整體變動,一處修改到處有效。

  • 數據庫表段字段常量和SQL邏輯分離,更清晰,建議使用Lite系列框架LiteOrm庫,超級清晰且重心可以放在業務上不用關心數據庫細節。

  • 全局變量放全局類中,模塊私有放自己的管理類中,讓常量清晰且集中.
    不要相信龐大的管理類的東西會帶來什么好處,可能是一場災難,而要時刻注意單一職責原則,一個類專心做好一件事情更為清晰。

  • 如果數據沒有必要加載,數據請務必延遲初始化,謹記為用戶節省內存,總不會有壞處。

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

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

  • 信息同步:不管是數據庫還是網網絡操作,新插入的數據注意返回ID(如果沒有賦予唯一ID),否則相當于沒有同步。

  • 多線程操作數據庫時,db關閉了會報錯,也很可能出現互鎖的問題,推薦使用事務,推薦使用自動化的LiteOrm庫操作。

  • 做之前先考慮那些可以公用,資源,layout,類,做一個結構、架構分析以加快開發,提升代碼可復用度。

  • 有序隊列操作add、delete操作時注意保持排序,否則你會比較難堪喔。

  • 數據庫刪除數據時,要注意級聯操作避免出現永遠刪不掉的臟數據喔。

  • 關于形參實參:調用函數時參數為基本類型傳的是值,即傳值;參數為對象傳遞的是引用,即傳址。

  • listview在數據未滿一屏時,setSelection函數不起作用;ListView批量操作時各子項和視圖正確對應,可見即所選。

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

  • arraylist執行remove時注意移除int和Integer的區別。你懂得。

  • Log請打上Tag,調試打印一定要做標記,能定位打印位置,否則尷尬是:不知道是哪里在打印。

  • 碼塊/常量/資源可以集中公用的一定共用,即使共用邏輯稍復雜一點也會值得,修改起來很輕松,修改一種,到處有效。

  • setSelection不起作用,嘗試smoothScrollToPosition。ListView的LastVisiblePosition(最后一個可見子項)會隨著getView方法執行位置不同變動而變。

  • 與Activity通訊使用Handler更方便; 如果你的框架回調鏈變長,考慮監聽者模式簡化回調。

  • 監聽者模式不方便使用時,推薦EventBus框架庫,使用時間總線,沒接觸過的同學可以自行腦補一下哦。

  • Handler在子線程線程使用Looper.prepare,或者new的時候給構造函數傳入MainLooper來確保在主線程run。

  • timepicker 點擊確定后需要clearFocus才能獲取手動輸入的時間。

  • 構造函數里面極度不推薦啟動異步線程,會埋下隱患。比如:異步線程調用了本例的示例,就會悲劇等著崩潰吧。

  • 千萬不要理所當然的以為一個對象不會為空,充分的做好容錯處理;另外注意null也可以插入ArrayList等容器中。

  • ExpandableListView的子列表不能點擊(禁用)要把Adapter的isChildSelectable方法返回true。

  • UI顯示注意內容過長的情形要提前使用ScrollView否則在小手機上尷尬你懂得。
    注意按鈕的感應范圍不小于9mm否則不易點擊;輸入框注意光標的位置更易用戶輸入。

  • 服務器和客戶端盡量統一唯一標識(有可能是ID),否則多少會有歧義和問題。

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

  • 完整型數據一定要用Sqlite的Transaction,大數據一定要用。粗略測試插入100個數據有20倍的提速,插入1000個數據就有100多倍的提速。

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

  • 存在多個不同的dbhelper實例情況下,sqlitedatabase對象必然存在不同的實例,多線程同時寫入數據,輪流寫入數據時會不定時的報db is locked,引起崩潰,不管是操作同張表還是異表。讀和寫可以同時并發,輪流無規律的交替執行。同時寫入數據時解決方案是用并發的每個線程都用事務,db則不會lock,按次整體寫入。

  • 建議整個應用維護一個dbhelper實例,只要db沒有關閉,全局就只有一個db實例,多線程并發寫入db不會lock,嚴格交替進行寫入:123123123。。。(123代表不同線程,輪流插入一個記錄),讀和寫均不會鎖住db,讀寫交替并沒有規律,執行次數和程度看cpu分配給哪個線程的時間片長。

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

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

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

  • 編碼遇到讀寫、出入等邏輯要雙向考慮,文件導入導出,字符字節相互轉換都要兩邊轉碼。

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

  • 對象由元數據和數據組成。元數據包括類(指向類的指針,描述了類的類型),標記(描述了對象狀態,如散列碼、形狀等),鎖(對象同步信息)。數組對象還包括大小的元數據。

  • 一個在 32 位 Java 運行時中使用 1GB Java 堆的 Java 應用程序在遷移到 64 位 Java 運行時之后,通常需要使用 1.7GB 的 Java 堆。

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

  • 對于并不那么注重訪問性能的較小集合而言,List 則是合理的選擇。ArrayList 和 LinkedList 集合的性能大體相同,但其內存占用完全不同:ArrayList 的每條目大小要比 LinkedList 小得多,但它不是準確設置大小的。List 要使用的正確實現是 ArrayList 還是 LinkedList 取決于 List 長度的可預測性。如果長度未知,那么正確的選擇可能是 LinkedList,因為集合包含的空白空間更少。如果大小已知或可預知或比較小,那么 ArrayList 的內存開銷會更低一些。

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

  • 充分利用封裝(提供接口類來控制訪問數據)和委托(helper對象來實施任務)兩種理念。

  • 延遲分配 Hashtable:如果 Hashtable 為空是經常發生的普遍現象,那么僅在存在需要存儲的數據時分配 Hashtable 應該是一種合理的做法。將 Hashtable 分配為準確的大。弘m然會有默認大小,但建議使用更為準確的初始大小。

  • EditText在setText時不要忘記是否需要setSelection。在大多數情況下是需要設置的。

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

  • 當邏輯沒有明顯問題時考慮對象屬性、函數參數、網絡傳輸參數是否全部了解,是否設置正確。

  • 當出現編譯或者運行時錯誤,別人那沒問題時,考慮你的編譯環境和環境版本是否有問題。

  • 由于String類的immutable性質,當String變量需要經常變換其值時,應該考慮使用StringBuilder提升性能,多線程使用StringBuffer操作string提高程序效率。

  1. 棧的優勢是比堆速度快,可共享,主要存放臨時變量、參數等,堆的優勢是可動態分配內存大小。

  • 只要是用new()來新建對象的,都會在堆中創建,而且其數據是單獨存值的,即使與棧中的數據(值)相同,也不會與棧中的數據共享。

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

  • 多個RandomAccessFile對象指向同一個文件,可使用多個線程一起寫入無需再自己加鎖,經試驗結論:三個線程分別寫入100萬次數據,使用鎖約12秒,不使用約8.5秒。100個線程分別寫入1萬次數據使用鎖耗時約4.2秒,不使用鎖耗時約3秒。

  • XmlPullParser解析慎用nextText()方法,xml比較復雜,含有空標簽、重復名字標簽時容易出現異常問題;TEXT中使用getText()方法代替START_TAG中使用nextText()方法;START_TAG,TEXT,END_TAG三個事件配合使用。注意每個xml節點之間(不管是開始節點還是結束節點)都會出現TEXT事件。

  • 改變邏輯的時候考慮全部用到這項功能的地方,分散的地方多了,容易大意。
    當系統原生組件出現問題時,查看錯誤棧信息,自己寫一個該組件的子類,并在合適的地方將出錯方法復寫一下,加上try catch保證不崩潰掉。不要擾亂了該系統控件的正常邏輯。

  • 輸入控件注意對空格、換行等符號的控制;輸入框里內容注意和左右控件的空間,防止誤點擊。

  • 注意函數參數里的++或者–操作。是++c 還是 c++,區別很大。

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

結尾

其實對于程序員來說,要學習的知識內容、技術有太多太多,要想不被環境淘汰就只有不斷提升自己,從來都是我們去適應環境,而不是環境來適應我們!

當程序員容易,當一個優秀的程序員是需要不斷學習的,從初級程序員到高級程序員,從初級架構師到資深架構師,或者走向管理,從技術經理到技術總監,每個階段都需要掌握不同的能力。早早確定自己的職業方向,才能在工作和能力提升中甩開同齡人。

最后想要拿高薪實現技術提升薪水得到質的飛躍。最快捷的方式,就是有人可以帶著你一起分析,這樣學習起來最為高效,所以為了大家能夠順利進階中高級、架構師,我特地為大家準備了一套高手學習的源碼和框架視頻等精品Android架構師教程,保證你學了以后保證薪資上升一個臺階。

以下是今天給大家分享的一些獨家干貨:

【Android開發核心知識點筆記】

Android開發中這60個需要注意的細節,你都注意到了嗎?

【Android思維腦圖(技能樹)】

Android開發中這60個需要注意的細節,你都注意到了嗎?

【Android核心高級技術PDF文檔,BAT大廠面試真題解析】

Android開發中這60個需要注意的細節,你都注意到了嗎?

【Android高級架構視頻學習資源】

Android精講視頻領取學習后更加是如虎添翼!進軍BATJ大廠等(備戰)!現在都說互聯網寒冬,其實無非就是你上錯了車,且穿的少(技能),要是你上對車,自身技術能力夠強,公司換掉的代價大,怎么可能會被裁掉,都是淘汰末端的業務Curd而已!現如今市場上初級程序員泛濫,這套教程針對Android開發工程師1-6年的人員、正處于瓶頸期,想要年后突破自己漲薪的,進階Android中高級、架構師對你更是如魚得水,趕快領取吧!

Android開發中這60個需要注意的細節,你都注意到了嗎? 轉載http://www.hxslwl.com/appboke/44462.html

技術博客閱讀排行

最新文章

久久人人97超碰人人澡,久久人人97超碰人人澡苹果,久久人人97超碰