一·概述

首先说一下内存泄露有什么影响:

LeakCanary使用_内存泄露

LeakCanary使用_内存泄漏_02

LeakCanary使用_内存泄露_03

LeakCanary使用_内存泄漏_04

二.使用

下面看看如何使用leakcanary

首先在gradle文件中引入相关库

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

然后在全局Application中进行配置

public class MyApplication extends Application {

private RefWatcher mRefWatcher;
@Override
public void onCreate() {
super.onCreate();
mRefWatcher = LeakCanary.install(this);
}
public static RefWatcher getRefWatcher(Context context){
MyApplication mApp = (MyApplication) context.getApplicationContext();
return mApp.mRefWatcher;
}
}

使用RefWatcher观察Fragment的内存泄露

public abstract class BaseFragment extends Fragment {

@Override public void onDestroy() {
super.onDestroy();
RefWatcher refWatcher = ExampleApplication.getRefWatcher(getActivity());
refWatcher.watch(this);
}
}

上传至服务器

public class LeakUploadService extends DisplayLeakService{
@Override
protected void afterDefaultHandling(HeapDump heapDump, AnalysisResult result, String leakInfo) {
super.afterDefaultHandling(heapDump, result, leakInfo);
if(!result.leakFound||result.excludedLeak){
return;
}
//然后上传我们的文件
UploadUtil.uploadFile(heapDump.heapDumpFile,"服务器地址");
}
}

在正式发布的应用中使RefWatcher失效

mRefWatcher = RefWatcher.DISABLED;

三.实例

下面我们用leakcanary来检测一下内存泄漏,看看到底行不行
代码如下

public class MainActivity extends AppCompatActivity {
private TextView textViewShowMessage;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void click(View view){
Toast.makeText(this, "启动", Toast.LENGTH_SHORT).show();
new Thread(){
@Override
public void run() {
super.run();
SystemClock.sleep(10000);
}
}.start();
}
}

当我们让线程运行起来以后,然后旋转屏幕,很明显上面的代码会产生内存泄露,因为Activity虽然销毁了,但是Thread类持有外部类的引用,产生了内存泄漏。

这时候通知栏会出现一个提示,

LeakCanary使用_ide_05

我们点开通知

LeakCanary使用_ide_06

可以看到泄露信息。这就是leakcanary的使用,总结一下,功能强大,使用简单

最后给出Demo下载地址
​Leakcanary使用Demo​​