square/leakcanary
udacity/Sunshine-Version-2

添加LeakCanary依赖包

在主模块app下的build.gradle下添加如下依赖:

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

Android内存泄漏检测-LeakCanary_第1张图片

开启LeakCanary

添加Application子类

首先创建一个ExampleApplication,该类继承于Application,在该类的onCreate方法中添加如下代码开启LeakCanary监控:

  LeakCanary.install(this);

Android内存泄漏检测-LeakCanary_第2张图片

在配置文件中注册ExampleApplication

AndroidManifest.xml中的 application标签中添加如下信息:

  android:name=".ExampleApplication"

Android内存泄漏检测-LeakCanary_第3张图片

这个时候安装应用到手机,会自动安装一个Leaks应用,如下图:
Android内存泄漏检测-LeakCanary_第4张图片

制造一个内存泄漏的点

建立一个 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<Activity> container = new SparseArray<Activity>();    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是如何报出这个问题的。

演示

Android内存泄漏检测-LeakCanary_第5张图片

解析的过程有点耗时,所以需要等待一会才会在Leaks应用中,当我们点开某一个信息时,会看到详细的泄漏信息:
Android内存泄漏检测-LeakCanary_第6张图片

作者:qhshiniba 发表于2015/10/23 18:23:31 原文链接 阅读:0 评论:0 查看评论

更多相关文章

  1. android 修改图片的颜色
  2. XAMARIN Android获取WIFIMAC地址的方法
  3. 实时获取Android 各版本电量的统一方法
  4. 利用浏览器默认方法获取浏览器当前位置
  5. 【Android】实现Activity页面暂停几秒后跳转的两种方法
  6. android实现图片圆角化实现三种方法
  7. android的单个图片 上传服务器
  8. “android list targets 无target显示” 的解决方法。
  9. Android开发中获取本机Mac地址和IP地址的方法

随机推荐

  1. android样式学习(二) android给listview设
  2. Android:图文解析带你快速了解RxJava原理
  3. Android原生 Spinner下拉选择框 使用中遇
  4. Android Camera 数据流
  5. Android 动态链接库 So 的加载
  6. android 实现文字滚动效果
  7. Android MediaPlayer 字幕同步
  8. android之无返回结果跳转intent
  9. android window部分属性
  10. Android(一)开发环境的搭建