我的簡書: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)化
- 使用Lint(AS -> Analyze -> Inspect code) — 查看你的view 層級哪些地方可以優(yōu)化;
- 刪除布局中無用的控件和層級;
- 使用include標簽重用布局文件;
- 盡量減少內(nèi)嵌的層級—>可考慮使用merge標簽【刪減多余的層級】;
- 使用ViewStub標簽按需加載所需的布局文件;
2、繪制優(yōu)化
- 在onDraw方法中不要創(chuàng)建新的局部變量;
- 在onDraw方法不做耗時操作和避免循環(huán);
3、內(nèi)存泄露優(yōu)化(MAT分析和LeakCanary分析檢測內(nèi)存泄露)
- 單例模式導致的內(nèi)存泄露 —> 不要持有Activity或Fragment的引用改用Application的Context;
- 屬性動畫導致的內(nèi)存泄露:開啟一個重復的動畫沒有在onDestroy中停止播放;
- 非靜態(tài)內(nèi)部內(nèi)的靜態(tài)實例,非靜態(tài)內(nèi)部類會維持一個到外部類實例的引用,如果非靜態(tài)內(nèi)部類的實例是靜態(tài)的,就會間接長期維持著外部類的引用,阻止被回收掉,可以使用靜態(tài)內(nèi)部類和WeakReference代替。
- 資源對象未關(guān)閉,資源性對象如Cursor、File、Socket,應該在使用后及時關(guān)閉。未在finally中關(guān)閉;
- 注冊對象未反注冊,未反注冊會導致觀察者列表里維持著對象的引用,阻止垃圾回收。在必要的地方及時反注冊,如廣播,EventBus;
- Handler臨時性內(nèi)存泄露,一般將Handler定義為靜態(tài)的,推薦使用靜態(tài)內(nèi)部類+弱引用 WeakReference 這種方式,但要注意每次使用前判空
- 避免Bitmap的浪費,臨時bitmap的主動回收Bitmap,bitmap.recycle();bitmap=null;
- 使用軟引用保存對象,當內(nèi)存緊張時會釋放,使用弱引用保存對象,當發(fā)生GC操作時釋放對象
- 對象的復用:復用系統(tǒng)的資源,ListView的ConvertView復用,避免在onDraw方法里執(zhí)行對象的創(chuàng)建
- 類的靜態(tài)變量持有大數(shù)據(jù)對象,不使用時及時置為null;
- Try catch某些大內(nèi)存的分配的操作;
4、ListView優(yōu)化
- 復用convertView
- 緩存item條目的引用,減少findViewbyId—>ViewHolder
- 數(shù)據(jù)的 分頁/分批 加載:對大量的數(shù)據(jù)進行分頁展示,對不同的滾動狀態(tài)進行分別處理,在快速滑動狀態(tài)不加載數(shù)據(jù)
- 圖片的緩存,需要解決圖片錯位問題—>推薦使用成熟框架Glide或Picasso
- 根據(jù)列表的滑動狀態(tài)來控制任務的執(zhí)行頻率(在快速滑動時不要加載圖片)
- 可以開啟硬件加速使ListView更加流暢(android:hardwareAccelerated="true")
- 將ListView的scrollingCache和animateCache這兩個屬性設置為false(默認是true);
- 避免GC(可以從LOGCAT查看有無GC的LOG);
- 盡可能減少List Item的Layout層次(如可以使用RelativeLayout替換LinearLayout,或使用自定的View代替組合嵌套使用的Layout);
5、Bitmap優(yōu)化
- 避免Bitmap的浪費,臨時bitmap的主動回收Bitmap,bitmap.recycle();bitmap=null;
- 使用三級緩存,內(nèi)存-sd卡-網(wǎng)絡,將大圖片用BitmapFactory壓縮采樣處理(使用inSampleSize參數(shù))再放到內(nèi)存中;
6、數(shù)據(jù)庫的優(yōu)化
- 盡量利用原生的SQL語句,原生的SQL省去了拼接sql語句的步驟,要比SqliteDatabase提供的insert、query、 update、delete等函數(shù)效率高。當數(shù)據(jù)庫越大,差別也越大;
- 當操作條數(shù)較多時,利用事務進行批處理,這樣SQLite將把全部要執(zhí)行的SQL語句先緩存在內(nèi)存當中,然后等到COMMIT的時候一次性的寫入數(shù)據(jù)庫,這樣數(shù)據(jù)庫文件只被打開關(guān)閉了一次,效率自然大大的提高;
7、其他優(yōu)化
- 響應速度優(yōu)化并避免ANR,分析ANR文件(/data/anr/traces.txt);
- 盡量避免使用枚舉(枚舉占用空間大);
- 線程優(yōu)化:采用線程池避免線程的創(chuàng)建和銷毀所帶來的性能開銷;