關於Android效能優化的簡單總結
Android效能優化主要分幾大類:1。app啟動優化 2.佈局優化 3. 響應優化 4.記憶體優化 5.網路優化
一。效能分析工具
1。Hierarchy Viewer提供了一個視覺化的介面來檢測佈局的層級,讓我們可以優化佈局層級,刪除多餘的不必要的層級,提升佈局速度
其中下邊有三個圓形的圖示分別表示測量 、 排版、畫布局的效能 綠色表示比50%的都快 黃色表示比50%都慢,紅色表示是最慢的
2. TraceView 一個圖形化的工具,用來展示和分析方法的執行時間。根據展示的時間來進行方法的優化
二。App啟動優化
1.application的onCreate方法中不要做太多的事情
2.首屏activity儘量要簡化
三。佈局優化
1.儘量減少佈局層級和複雜度
去除不必要的父佈局
儘量不要巢狀使用RelativeLayout
多用TextView的Drawable
如果HierarchyViewer的層級超過了五層一定要優化
2.使用include來重用佈局
3.listview的優化
convertView的複用
引入ViewHolder來減少findViewById();
資料要使用分頁載入
四。響應優化
Anr產生時,會在data\anr\traces.txt 生成一個日誌檔案,可以檢視導致anr產生的原因
如何避免:不要在ui執行緒執行耗時的操作,包括網路請求 資料解析 圖片載入,耗時的操作要放在子執行緒中執行
五。記憶體優化
主要出現的問題:記憶體消耗過大,記憶體洩露,記憶體抖動最主要的原因是因為gc操作過於頻繁,在進行gc的時候所線上程會停止執行
記憶體消耗過大:Android中常見的就是圖片資源消耗過大,因此在載入圖片的時候建議使用開發的圖片框架,比如universal-image-loader,或者是glide
記憶體洩露: 1.對context的引用 如果是全部變數引用context這時候該activity的生命週期被延長,這時候可以用application的context。
使當前的activity可以及時的銷燬掉,釋放記憶體
總結:根據元件的生命週期合理使用context
2.內部類的問題
當在一個類中new一個內部類的時候,這時內部類會持有外部類的引用,這時候建議使用靜態內部類,這樣當內部類建立的時候並不需要外部類的引用,
減少外部類的生命週期,使其可以更好的被回收釋放資源
如果內部類想呼叫外部類的方法,可以使用弱引用
程式碼示例:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_memory_leak);
new DemoHandler(this).sendEmptyMessageDelayed(1, 60 * 1000);
}
private static class DemoHandler extends Handler {
private final WeakReference<HandlerLeakActivity> mActivity;
private DemoHandler(HandlerLeakActivity activity) {
this.mActivity = new WeakReference<>(activity);
}
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
HandlerLeakActivity activity = mActivity.get();
if (activity != null) {
activity.doSomething();
}
}
}
private void doSomething() {
}
3.觀察者 listener 廣播等註冊和銷燬沒有成對出現,會出現記憶體洩露
常用的方法有 add\remove register\unregister bind\unbind
4.資源洩露
常見的有:cursor、io、資料庫連結等沒有及時的關閉
5.bitmap記憶體洩露
bitmap沒有及時回收導致記憶體洩露
一般情況下可以使用軟引用,當記憶體不夠的時候可以回收掉
6.在UI看不見時釋放Memory
在使用者切換到其他的app,並且你的app頁面不可見時,你應該釋放你的ui上佔用的任何資源。為了能夠接收到使用者離開你UI的通知,
應該重寫activity的onTrimMemory()方法(API14,如果是更好的版本可以使用onLowMemory()),在這個方法裡面監聽UI當前app的UI級別,
如果是TRIM_MEMORY_UI_HIDDEN當用戶按下home鍵時該方法會被呼叫,這時可以讓程式直接退出呼叫 System.exit0(0);
如何解決gc頻繁操作:1.儘量不要在迴圈裡面頻繁建立物件,這樣的話每迴圈一次就會銷燬,就會呼叫垃圾回收,gc執行的時候會阻塞執行緒,導致頁面卡頓。
成員變數要在類裡面進行定義,這樣能減少不必要的gc操作
總結:當系統開始清除lru的程序時,儘管首先按照例如的順序來管理程序,但他同樣會考慮程序的記憶體使用量,噹噹前程序使用記憶體過多的時候同樣會被回收掉。
六。網路優化
減少網路請求的頻次: 把需要的資料儘量封裝在一個集合中,減少請求的次數
減小獲取資料包的大小:主要是獲取資料的型別現在一般使用json可讀性好,佔用的資源較小
使用網路快取: 把一些時效性不高的資料可以適當的進行網路快取
比如首頁的圖片可以進行快取