LeakCanary使用
原创
©著作权归作者所有:来自51CTO博客作者lxn1615404043的原创作品,请联系作者获取转载授权,否则将追究法律责任
一·概述
首先说一下内存泄露有什么影响:




二.使用
下面看看如何使用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的使用,总结一下,功能强大,使用简单
最后给出Demo下载地址
Leakcanary使用Demo