LeakCanary使用

来源:互联网 发布:电脑编程有学校吗 编辑:程序博客网 时间:2024/05/14 20:19

一·概述

首先说一下内存泄露有什么影响:
这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

二.使用

下面看看如何使用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

0 0