Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android內存洩漏檢測-LeakCanary

Android內存洩漏檢測-LeakCanary

編輯:關於Android編程

 
 

添加LeakCanary依賴包

在主模塊app下的build.gradle下添加如下依賴:

debugCompile 'com.squareup.leakcanary:leakcanary-android:1.3.1'
    releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.3.1'

這裡寫圖片描述

開啟LeakCanary

添加Application子類

首先創建一個ExampleApplication,該類繼承於Application,在該類的onCreate方法中添加如下代碼開啟LeakCanary監控:

LeakCanary.install(this);

這裡寫圖片描述

在配置文件中注冊ExampleApplication

AndroidManifest.xml中的application標簽中添加如下信息:

android:name=.ExampleApplication

這裡寫圖片描述

這個時候安裝應用到手機,會自動安裝一個Leaks應用,如下圖:
這裡寫圖片描述

制造一個內存洩漏的點

建立一個ActivityManager類,單例模式,裡面有一個數組用來保存Activity

package com.example.android.sunshine.app;

import android.app.Activity;
import android.util.SparseArray;
import android.view.animation.AccelerateInterpolator;

import java.util.List;

/**
 * Created by wuxian on 15/10/23.
 */
public class ActivityManager {
    private SparseArray container = new SparseArray();
    private int key = 0;
    private static ActivityManager mInstance;

    private ActivityManager(){}

    public static ActivityManager getInstance(){
        if(mInstance == null){
            mInstance = new ActivityManager();
        }

        return mInstance;
    }

    public void addActivity(Activity activity){
        container.put(key++,activity);
    }


}

然後在DetailActivity中的onCreate方法中將當前activity添加到ActivityManager的數組中:

 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_detail);
        ActivityManager.getInstance().addActivity(this);
        if (savedInstanceState == null) {
            // Create the detail fragment and add it to the activity
            // using a fragment transaction.

            Bundle arguments = new Bundle();
            arguments.putParcelable(DetailFragment.DETAIL_URI, getIntent().getData());

            DetailFragment fragment = new DetailFragment();
            fragment.setArguments(arguments);

            getSupportFragmentManager().beginTransaction()
                    .add(R.id.weather_detail_container, fragment)
                    .commit();
        }
    }

我們從首頁跳轉到詳情頁的時候會進入DetailActivityonCreate的方法,然後就將當前activity添加到了數組中,當返回時,我們沒把他從數組中刪除。再次進入的時候,會創建新的activity 並添加到數組中,但是之前的activity仍然被引用,無法釋放,但是這個activity不會再被使用,這個時候就造成了內存洩漏。我們來看看LeakCanary是如何報出這個問題的。

演示

這裡寫圖片描述

解析的過程有點耗時,所以需要等待一會才會在Leaks應用中,當我們點開某一個信息時,會看到詳細的洩漏信息:
這裡寫圖片描述

 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved