我认为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次而不启动位置更新:
如果使用onPause()
方法停止stopLocationUpdates()
位置更新,为什么会发生内存泄漏?
为什么LeakCanary没有检测到这些泄漏?
答案 0 :(得分: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'
答案 1 :(得分:0)
您应该再次运行您的应用程序。因为在我们第一次启动调试版本时,金丝雀泄漏剂量能够识别泄漏。但请关闭该应用程序并再次运行,它将识别出泄漏(但请确保在弹出窗口弹出时向canaryleak授予所需的权限)。 祝你好运