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