Android編程規范及優化

jopen 9年前發布 | 13K 次閱讀 Android Android開發 移動開發

一、編碼規則

1.      函數的規模盡量限制在 200 行以內。

2.      一個方法僅完成一件功能。如果一個方法實現多個功能,可以考慮分拆成多個方法,每個方法實現一個功能。

3.      如果多段代碼重復做同一件事情,那么可考慮提供一個公用的方法實現這個功能,供其它方法調用。

4.      檢查函數所有參數輸入的有效性。例如參數傳入 ArrayList 對象為空,如果直接使用會導致程序異常。

5.      對方法的異常中應有全面的處理,不要想當然在 try 塊中實現的功能中只可 能發生某一種異常,實際上可能會發生很多異常,如:IOException、NullPointerException 等,對拋出的異常最后應加上捕捉默認的 Exception,并進行處理。

6.      數據庫的操作,應記得關閉游標和數據庫,在需要SimpleCursorAdapter時,可使用Activity.startManagingCursor(Cursor c)來管理游標,使游標的生命周期和Activity的生命周期一致。

7.      Log(系統名稱 模塊名稱 接口名稱,詳細描述),方便定位問題

8.      不要重用父類的handler,對應一個類的handler也不應該讓其子類用到,否則會導致message.what沖突

9.      數據一定要效驗,例如字符型轉數字型,如果轉換失敗一定要有缺省值;服務端響應數據是否有效判斷;

10.   程序中使用到的資源應當被釋放,以避免資源泄漏。這最好在finally塊中去做。不管程序執行的結果如何,finally塊總是會執行的,以確保資源的正確關閉。

11.   在OnDestroy()中 將不用的static的成員置成null

12.   遍歷Collection的不要去修改或刪除元素。如有刪除的元素,可以在遍歷之后完成。

二、  性能優化

2.1 代碼優化

1.      字符串頻繁操作時,多用StringBuffer而少用String

2.      盡量使用本地變量,即反復使用的變量要先保存成臨時或局部變量,尤其是循環中使用的變量

3.      如果一個方法不訪問(不修改)成員變量,請用static

4.      盡量不用get和set,如果你非要用的話請加上final關鍵字,編譯器會把它當成內聯函數

5.      不修改的static變量請用static final常量代替

6.      避免使用枚舉,請使用常量代替(枚舉需要創建對象,開銷更大)

7.      不使用的引用變量要手動置null,提高內存被回收的幾率

8.      用多個一維數組代替二維數組 int[][]=====int[] int[],二維數據占用的內存空間比一維數組多得多,大概10倍以上。

9.      不要在循環當中聲明臨時變量,不要在循環中捕獲異常

10.   如果對于線程安全沒有要求,盡量使用線程不安全的集合對象

11.   如果程序會頻繁創建線程,則可以考慮使用線程池。

12.   創建新的對象都需要額外的內存空間,要盡量減少創建新的對象。

13.   對Context的使用如果可以用Application Context,盡量別用Activity Context,以防止Activity占用內存不能及時回收。

14.   static變量在程序運行期間其內存是共享的,且只有一份,所以有時將一些變量聲明為static,可以起到節約內存空間的作用,但是由于靜態變量生命周期很長,不易被系統回收,所以使用靜態變量要合理,不能盲目的使用。

15.   盡量避免非常大的內存分配,有時候問題不是由當時的堆狀態造成的,而是因為分配失敗造成的。分配的內存塊都必須是連續的,而隨著堆越來越滿,找到較大的連續塊越來越困難。

16.   盡量使用System.arraycopy ()代替通過來循環復制數組,System.arraycopy() 要比通過循環來復制數組快的多

17.    適當的使用弱引用(WeakReference)。當定義了一個對象,用弱引用記住它后,在下一次GC運行時就會把它當作無用的對象回收,和軟引用的區別是不會根據內存情況判斷。

 

2.2啟動優化

1.     減少靜態對象創建,盡可能不要在Application 執行靜態邏輯代碼。

2.     Application在oncreat中,不要做io讀寫等耗時操作,如果要做,則盡量可能延后執行放到非UI線程去做。

3.     在減少閃屏的布局的層次,盡可能在xml中布局,而非代碼中動態創建。

4.     閃屏界面Activity的theme設置為透明色,防止運行慢時出現的白屏或黑屏現象。

5.     不要在activity的onCreat, onStart,onResume的生命周期中去加載動畫,盡量延遲加載,以防止出現卡屏。

2.3布局優化

1.     抽象布局標簽

(1) <include>標簽

include標簽常用于將布局中的公共部分提取出來供其他layout共用,以實現布局模塊化,這在布局編寫方便提供了大大的便利。

(2) <viewstub>標簽

viewstub標簽同include標簽一樣可以用來引入一個外部布局,不同的是,viewstub引入的布局默認不會擴張,即既不會占用顯示也不會占用位置,從而在解析layout時節省cpu和內存。

viewstub常用來引入那些默認不會顯示,只在特殊情況下顯示的布局,如進度布局、網絡失敗顯示的刷新布局、信息出錯出現的提示布局等。

(3) <merge>標簽

在使用了include后可能導致布局嵌套過多,多余不必要的layout節點,從而導致解析變慢,不必要的節點和嵌套可通過hierarchy viewer或設置->開發者選項->顯示布局邊界查看。

2.     能用線性布局(LinearLayout)很方便的實現的,盡量用線性布局實現(效率相對高)。

3.     如果多個Activity中包含共同的UI處理,那么可以提煉一個CommonActivity,把通用部分叫由它來處理,其他activity只要繼承它即可或者用fragment來實現。

4.     styles.xml:將layout中不斷重現的style提煉出通用的style通用組件,放到styles.xml中。

 

2.4圖片優化

1.     如圖片尺寸大于界面顯示尺寸,可以轉化為縮略圖再加載:

BitmapFactory.Options options = new BitmapFactory.Options();   

options.inSampleSize = 2; 

Bitmap img = BitmapFactory.decodeFile("/sdcard/1.png", options); 

     

2.     用ARBG_4444色彩模式加載圖片:

Android中有四種,分別是:

ALPHA_8:每個像素占用1byte內存

ARGB_4444:每個像素占用2byte內存

ARGB_8888:每個像素占用4byte內存

RGB_565:每個像素占用2byte內存

Android默認的色彩模式為ARGB_8888,這個色彩模式色彩最細膩,顯示質量最高。但同樣的,占用的內存也最大。

3.     本地的背景圖片,首先考慮用shape或者.9替代,不能代替的圖片,可以考慮是否可以延后加載。

4.     Bitmap不用的時候,及時調用recycle(),

5.     采用開源框架如:Universal-Image-Loader ,picasso, Volley 均實現對圖片的緩存和加載優化。

2.5 ListView列表優化

1.      多用convertView緩存,減少頻繁創建和加載布局,減少滑動時GC次數

2.      采用ViewHolder模式,緩存子布局,來減少findViewById使用頻率,

3.      ListView中item的布局至關重要,必須盡可能的減少使用的控件,布局的層級,千萬不要item布局中再嵌套listView或者GridView會嚴重影響流暢性。

4.      getView方法中不能做復雜的邏輯計算,特別是數據庫操作,否則會嚴重影響滑動時的性能。 遇到圖片等大數據的加載時,采用異步加載策略。

5.      如item條目很多可以考慮分頁加載的方式,來減少內存的占用。

6.      ListView的背景色與cacheColorHint設置相同顏色,可以提高滑動時的渲染性能

7.      ListView,GridView的高寬盡量使用fill_parent,match_parent,或者具體高度。(使用wrap_content每次getView()都會去計算高寬,會頻繁調用getView())

來自:http://my.oschina.net/mastere/blog/414657

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!