使用Android LeakCanary检测内存泄露
2020-10-31 本文已影响0人
hao_developer
这个东西特别简单,直接看官网就行了
就是GitHub地址:https://github.com/square/leakcanary
直接集成:
dependencies {
debugImplementation 'com.squareup.leakcanary:leakcanary-android:1.6.3'
releaseImplementation 'com.squareup.leakcanary:leakcanary-android-no-op:1.6.3'
// Optional, if you use support library fragments:
debugImplementation 'com.squareup.leakcanary:leakcanary-support-fragment:1.6.3'
}
直接在Application中使用,然后运行APP就会自动检测,检测到会在另一个APP上通知,显示详情
public class ExampleApplication extends Application {
@Override public void onCreate() {
super.onCreate();
if (LeakCanary.isInAnalyzerProcess(this)) {
// This process is dedicated to LeakCanary for heap analysis.
// You should not init your app in this process.
return;
}
LeakCanary.install(this);
// Normal app init code...
}
}
举个栗子
以匿名内部类为例,操作流程和之前的例子一样;正常来讲调用了finish()方法,第二个Activity会被销毁的,但是因为使用了匿名内部类,所以sRunnable会持有Main2Activity的引用,而且sRunnable还是一个静态变量,所以会导致Main2Activity不会被回收掉
public class Main2Activity extends AppCompatActivity {
private static Thread sRunnable;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
sRunnable = new Thread() {
@Override
public void run() {
}
};
findViewById(R.id.btn_back).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
finish();
}
});
}
}
运行程序,然后过一会儿就会收到提醒,检测到了内存泄漏,打开看看;大概意思就是说sRunnable这个对象,它引用了Main2Activity,导致了内存泄漏;这个工具的确非常的简单友好了
image.png