本文接着讲解如何去使用LeakCanary
详细步骤:
1.添加LeakCanary依赖包
https://github.com/square/leakcanary
在主模块app下的build.gradle下添加如下依赖:
debugCompile'com.squareup.leakcanary:leakcanary-android:1.3.1'
releaseCompile'com.squareup.leakcanary:leakcanary-android-no-op:1.3.1'
文章图片
2.开启LeakCanary 添加Application子类 【性能优化五之LeakCanary使用】首先创建一个ExampleApplication,该类继承于Application,在该类的onCreate方法中添加如下代码开启LeakCanary监控:
LeakCanary.install(
);
文章图片
在配置文件中注册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;
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();
}
}
我们从首页跳转到详情页的时候会进入
DetailActivity
的onCreate
的方法,然后就将当前activity
添加到了数组中,当返回时,我们没把他从数组中删除。再次进入的时候,会创建新的activity
并添加到数组中,但是之前的activity
仍然被引用,无法释放,但是这个activity
不会再被使用,这个时候就造成了内存泄漏。我们来看看LeakCanary
是如何报出这个问题的。演示
文章图片
解析的过程有点耗时,所以需要等待一会才会在Leaks应用中,当我们点开某一个信息时,会看到详细的泄漏信息:
文章图片
推荐阅读
- 有关性能优化的感悟
- Android|Android性能优化之布局优化
- Android|更改系统给APP应用分配最大的内存空间
- 性能优化|你想要的Android性能优化系列(启动优化 !)
- MySQL|MHA架构的优缺点
- 性能优化|大型网站性能优化要点
- 优化|大型网站性能优化 二 页面(HTML)优化的方法
- 性能优化|大型网站性能优化 一 C#高效编码的优化 系统