安卓性能優化積累

1、activity的泄露
(1)、如果你持有一個未使用的 Activity 的引用,其實也就持有了 Activity 的佈局,自然也就包含了所有的 View。
(2)、最棘手的是持有靜態引用(很危險)
Activity 和 Fragment 都有自己的生命週期。
一旦我們持有了靜態引用,Activity 和 Fragment 就不會被垃圾回收器清理掉了。(m_staticActivity = staticFragment.getActivity()

2、泄漏 Listener
列如:activity單例

public class LeakActivity extends Activity {
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    NastyManager.getInstance().addListener(this);
  }
}

/////如果關閉activity銷燬時單例沒有解綁,會報錯
////正確的做法:單例中移除掉對 Activity 的引用

@Override
public void onDestroy() {
  super.onDestroy();
  NastyManager.getInstance().removeListener(this);
}

3、內存泄漏—內部類(內部非靜態類是不能脫離所屬類而單獨存活的)

在 Activity 裏有一個很簡短的非靜態 Handler。
/////只要它還存活着,那麼包含它的 Activity 就會存活着

public class MainActivity extends Activity {
  //...
  Handler handler;
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    //...
    handler = new Handler() {
      @Override
      public void handleMessage(Message msg) {
              }
  }
}

//////解決:弱引用
垃圾回收器在回收的時候,是會忽視掉弱引用的,所以包含它的 Activity 會被正常清理掉。

///總結:
相比非靜態內部類,最好使用靜態內部類。區別就是靜態內部類不依賴所屬類

4、泄露總結:
•移除掉所有的靜態引用。
•考慮用 EventBus 來解耦 Listener。
•記着在不需要的時候,解除 Listener 的綁定。
•儘量用靜態內部類。
•做 Code Review。個人經驗:Code Review 能很早的發現內存泄漏。
•瞭解你程序的結構。
•用類似 MAT,Eclipse Analyzer,LeakCanary 這樣的工具分析內存。
•在 Callback 裏打印 Log。

5、實現流暢滑動的技巧
///UI 線程只用作 UI 渲染、不做下列的事:
•載入圖片
•網絡請求 ( Volley,也可以試試 Square 的 Retrofit)
•解析 JSON (Jackson 以及 ig-json-parser)
•讀取數據庫 (Loader,支持批量更新和載入)

6、確定你是否在主線程的代碼
Looper.myLooper() == Looper.getMainLooper()

7、併發 APIs
/////App 快速響應請求
—-> Service 的方法是在 UI 線程執行的。請考慮使用 IntentService,AsyncTask,Executors,Handler 和 Loopers。
(1)、IntentService(不用更新UI)
IntentService 是一個單線程,一次一個任務的工作流
大型複雜的任務,而且這個任務不需要跟 UI 打交道(執行上傳功能)
(2)、AsyncTask (更新 UI)
////注意:當你旋轉手機的時候,Activity 會被關閉,然後重啓。不然可能造成內存泄露。
(3)、Executor Framework
默認是存在一個由系統管理的線程池,你可以通過 callback,future 來控制和管理。

8、避免使用廢棄的 API

•不要通過反射來調用私有 API。 
•不要再 NDK 和 C 語言層調用私有 Native 方法。 
•不要輕易調用 Runtime.exec 指令完成進程通訊功能。 
•adb shell am 做進程通訊並不好。 

/////避免使用:
用 Toolbar 而非 ActionBar,
在需要動畫的時候用 RecyclerView,因爲它專門爲動畫做過優化。

9、理解架構:
學習下 App 組件的生命週期。
比如什麼是 Activity 的 Flag?
什麼是 Fragment?
什麼事 stated fragment?
什麼是 task?
讀讀文檔,嘗試下用回調的 log 搞清楚這些概念。

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