Android的性能優(yōu)化

我的簡書:http://www.itdecent.cn/u/c91e642c4d90
我的CSDN:http://blog.csdn.net/wo_ha
我的GitHub:https://github.com/chuanqiLjp
我的個人博客:https://chuanqiljp.github.io/

版權(quán)聲明:商業(yè)轉(zhuǎn)載請聯(lián)系我獲得授權(quán),非商業(yè)轉(zhuǎn)載請在醒目位置注明出處。

1、布局優(yōu)化

  1. 使用Lint(AS -> Analyze -> Inspect code) — 查看你的view 層級哪些地方可以優(yōu)化;
  2. 刪除布局中無用的控件和層級;
  3. 使用include標簽重用布局文件;
  4. 盡量減少內(nèi)嵌的層級—>可考慮使用merge標簽【刪減多余的層級】;
  5. 使用ViewStub標簽按需加載所需的布局文件;

2、繪制優(yōu)化

  1. 在onDraw方法中不要創(chuàng)建新的局部變量;
  2. 在onDraw方法不做耗時操作和避免循環(huán);

3、內(nèi)存泄露優(yōu)化(MAT分析和LeakCanary分析檢測內(nèi)存泄露)

  1. 單例模式導致的內(nèi)存泄露 —> 不要持有Activity或Fragment的引用改用Application的Context;
  2. 屬性動畫導致的內(nèi)存泄露:開啟一個重復的動畫沒有在onDestroy中停止播放;
  3. 非靜態(tài)內(nèi)部內(nèi)的靜態(tài)實例,非靜態(tài)內(nèi)部類會維持一個到外部類實例的引用,如果非靜態(tài)內(nèi)部類的實例是靜態(tài)的,就會間接長期維持著外部類的引用,阻止被回收掉,可以使用靜態(tài)內(nèi)部類和WeakReference代替。
  4. 資源對象未關(guān)閉,資源性對象如Cursor、File、Socket,應該在使用后及時關(guān)閉。未在finally中關(guān)閉;
  5. 注冊對象未反注冊,未反注冊會導致觀察者列表里維持著對象的引用,阻止垃圾回收。在必要的地方及時反注冊,如廣播,EventBus;
  6. Handler臨時性內(nèi)存泄露,一般將Handler定義為靜態(tài)的,推薦使用靜態(tài)內(nèi)部類+弱引用 WeakReference 這種方式,但要注意每次使用前判空
  7. 避免Bitmap的浪費,臨時bitmap的主動回收Bitmap,bitmap.recycle();bitmap=null;
  8. 使用軟引用保存對象,當內(nèi)存緊張時會釋放,使用弱引用保存對象,當發(fā)生GC操作時釋放對象
  9. 對象的復用:復用系統(tǒng)的資源,ListView的ConvertView復用,避免在onDraw方法里執(zhí)行對象的創(chuàng)建
  10. 類的靜態(tài)變量持有大數(shù)據(jù)對象,不使用時及時置為null;
  11. Try catch某些大內(nèi)存的分配的操作;

4、ListView優(yōu)化

  1. 復用convertView
  2. 緩存item條目的引用,減少findViewbyId—>ViewHolder
  3. 數(shù)據(jù)的 分頁/分批 加載:對大量的數(shù)據(jù)進行分頁展示,對不同的滾動狀態(tài)進行分別處理,在快速滑動狀態(tài)不加載數(shù)據(jù)
  4. 圖片的緩存,需要解決圖片錯位問題—>推薦使用成熟框架Glide或Picasso
  5. 根據(jù)列表的滑動狀態(tài)來控制任務的執(zhí)行頻率(在快速滑動時不要加載圖片)
  6. 可以開啟硬件加速使ListView更加流暢(android:hardwareAccelerated="true")
  7. 將ListView的scrollingCache和animateCache這兩個屬性設置為false(默認是true);
  8. 避免GC(可以從LOGCAT查看有無GC的LOG);
  9. 盡可能減少List Item的Layout層次(如可以使用RelativeLayout替換LinearLayout,或使用自定的View代替組合嵌套使用的Layout);

5、Bitmap優(yōu)化

  1. 避免Bitmap的浪費,臨時bitmap的主動回收Bitmap,bitmap.recycle();bitmap=null;
  2. 使用三級緩存,內(nèi)存-sd卡-網(wǎng)絡,將大圖片用BitmapFactory壓縮采樣處理(使用inSampleSize參數(shù))再放到內(nèi)存中;

6、數(shù)據(jù)庫的優(yōu)化

  1. 盡量利用原生的SQL語句,原生的SQL省去了拼接sql語句的步驟,要比SqliteDatabase提供的insert、query、 update、delete等函數(shù)效率高。當數(shù)據(jù)庫越大,差別也越大;
  2. 當操作條數(shù)較多時,利用事務進行批處理,這樣SQLite將把全部要執(zhí)行的SQL語句先緩存在內(nèi)存當中,然后等到COMMIT的時候一次性的寫入數(shù)據(jù)庫,這樣數(shù)據(jù)庫文件只被打開關(guān)閉了一次,效率自然大大的提高;

7、其他優(yōu)化

  1. 響應速度優(yōu)化并避免ANR,分析ANR文件(/data/anr/traces.txt);
  2. 盡量避免使用枚舉(枚舉占用空間大);
  3. 線程優(yōu)化:采用線程池避免線程的創(chuàng)建和銷毀所帶來的性能開銷;
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

  • 前言:本章知識不是為具體的一個性能問題提供詳細的解決方案,而是梳理和總結(jié)Android中性能優(yōu)化有關(guān)的問題,讓我們...
    松哦哦閱讀 1,023評論 0 6
  • Android的性能優(yōu)化 寫在前面: 零:性能指標 布局復雜度:布局復雜會導致布局需要更長的時間,從而導致進入應用...
    MeloDev閱讀 6,472評論 10 73
  • 所有知識點已整理成app app下載地址 J2EE 部分: 1.Switch能否用string做參數(shù)? 在 Jav...
    侯蛋蛋_閱讀 2,716評論 1 4
  • PPT 美化專題用來分享一些自己美化 PPT 的心得,在分享的過程中會穿插講一些設計理論和設計小技巧,冀望各位做演...
    shenxiaoma閱讀 4,093評論 1 30
  • 面試,是一場博弈。是一場自我包裝,征服對手的戰(zhàn)爭。 在進入戰(zhàn)場前,首先需要知己知彼。知道面試的崗位是什么,去了解對...
    零_bbc8閱讀 128評論 0 0

友情鏈接更多精彩內(nèi)容