Android性能優化

1. 在LinearLayout和RelativeLayout均能使用的情況下,並且嵌套層級相同(比如都是垂直往下的佈局),優先選擇LinearLayout,因爲其計算速度更快。

2. 當用LinearLayout時需要的的嵌套層級比RelativeLayout更多時,優先選擇RelativeLayout。

3. 能被多次複用的佈局(必出現),要抽取出來,用<includelayout="@layout/xx"> 和<merge ...>   來引用。

4. 當某個佈局只在特定條件出現的情況下(比如網絡不好的展示圖),用ViewStub引用,這樣就能夠按需加載。

5. 將耗時任務放入子線程。

6. 當將會有大量子線程出現的情況下(比如照片牆),用線程池。

7. 將那些有機會被本地讀出來的數據,不僅在後臺服務器保存一份,也在本地保存一份,sharedpreference.xml或者SQLite DB,那些簡單的key唯一的用前者(比如用戶名,密碼,暱稱等),而會大量出現重複的數據(比如每天測溫都要上傳)用後者。只有當寫或更新時纔將本地和網絡都更新,只讀時讀本地即可,速度提高很多。

8. 優化listview,a) getView裏的convertView的複用 b) viewHolder的使用 c)嵌套不要太多 d) 涉及網絡圖片時開啓線程池 e) 滾動時才加載 f) 圖片大小的控制 Bitmap.Options.inSampleSize

9.  圖片,文件的三級緩存, 內存LruCache, 磁盤DiskCache,網絡。

10. 大量數據庫查詢需要多次IO操作時(比如for循環嵌套,不斷的讀取db來組裝json格式),可以先把所有數據一次性讀入內存之後再操作內存來組裝,速度會有驚人的提升,30倍以上是很常見的。

11. 慎用AsyncTask,只有當任務能夠幾秒之內完成時使用,因爲一旦開始,Activity無法控制其結束,也就是Activity就算退出了,也會執行直至完畢。

12. 合理利用一些組合控件,比如TopBar, ListBar, CircleView。

13. 邏輯優化,合理的控制流程,算是好的算法能減少大量的無謂的計算。

14. 發佈時關閉log輸出,因爲其調用的是JNI。

15. 採用硬件加速。

16. 在androidmanifest.xml中application添加  android:hardwareAccelerated="true"。不過這個需要在android 3.0纔可以使用。

17. 優化你的佈局。通過Android sdk中tools目錄下的layoutopt 命令查看你的佈局是否需要優化。

18. 將Acitivity 中的Window 的背景圖設置爲空。getWindow().setBackgroundDrawable(null);android的默認背景是不是爲空。

19. 採用JNI,將耗時間的處理放到c/c++層來處理。

20. 數據庫表的建立合理關係,索引的建立,加速查詢速度。

21. 當某個操作觸發的工作內容需要遍歷一個很大的集合時,卻只爲了找出其中具備某個特徵的那一個,則通常不要把循環放到操作裏去做,否則每次都要循環一次,會變得很卡頓。好的做法是,操作之前,初始化一個map,把特徵值和id映射起來,那麼每次操作時,可以迅速根據id判斷其特徵值是否符合要求,這樣總體只需要遍歷一次即可,操作時的時間複雜度爲O(1),也消除了卡頓感。

22.  下載網絡數據到本地時,用一個接口把所有數據download下來,不要用多個接口不斷調用消耗網絡請求連接建立時間,插入本地數據庫時把要循環操作的放入事務中。不要把單個操作讓for循環來每次插入,而要把單個操作放入list中,讓事務裏執行for(list) opDB.

23. 當使用TabLayout + ViewPager + 多Fragment這種組織結構時, 一定要用使用懶加載,優化首次進入頁面的速度和滑動的流暢度(UserVisibleHint=true時再加載網絡數據和數據庫數據);否則會出現黑屏情況!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章