为什么在HPROF文件显示存在泄漏的活动时,LeakCanary未检测到内存泄漏

问题描述 投票:1回答:1

我认为FusedLocationProvider api的代码泄漏了,因为我在这个question中问道。我尝试使用LeakCanary来检测内存泄漏,但是在旋转手机后我没有收到任何内存泄漏警告,也尝试使用平板电脑。设置LeakCanary的代码:

public class MyApplication extends Application {
    private RefWatcher refWatcher;
    @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;
        }
        refWatcher = LeakCanary.install(this);
        // Normal app init code...
        Log.d("TAG", "MyApplication onCreate()");
    }
}

我尝试了20次但是2次我从LeakCanary收到通知,甚至没有旋转手机但是在设备旋转后应该发生内存泄漏。

我还有另一个问题,即使没有发生内存泄漏并且不存在对这些MainActivities的引用,为什么会创建MainActivity的新实例。

设备旋转2次而不启动位置更新:

Image No Memory Leak

开始位置更新后,设备旋转2次:Image with Memory Leak

如果使用onPause()方法停止位置更新stopLocationUpdates(),为什么会发生内存泄漏?

为什么LeakCanary没有检测到这些泄漏?

android memory-leaks fusedlocationproviderapi leakcanary
1个回答
0
投票

您不需要为RefWatcher创建变量。

你可以试试这个:

 @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...
}

还要确保你的gradle内有这些。

  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'
 testImplementation 'com.squareup.leakcanary:leakcanary-android-no-op:1.6.3'
© www.soinside.com 2019 - 2024. All rights reserved.