使用泄漏金丝雀时我的应用程序冻结-为什么?

时间:2019-01-04 12:54:39

标签: android android-layout memory leakcanary

我正在开发一个使用Leak Canary Library的Android TV应用程序,但问题是当我使用一段时间后,它显示一个错误“ Dumping Memory。App Freezes。Brrrr”。我在Google上搜索了建议的内容,但仍然出现错误。

清单中,我已提供写入和读取存储的权限。

应用类代码:

     public class App extends Application {

private RefWatcher refWatcher;

public static RefWatcher getRefWatcher(Context context) {
    App application = (App) context.getApplicationContext();
    return application.refWatcher;
}

@Override
public void onCreate() {
    super.onCreate();
    refWatcher = LeakCanary.install(this);

}

在我的Activity和Fragments中,我在OnDestroy()中使用了RefWatcher。方法。

        @Override
protected void onDestroy() {

    if (timer != null) {
        timer.cancel();
        timer = null;
    }
    if (handler != null)
        handler.removeCallbacks(Update);
    super.onDestroy();


    RefWatcher refWatcher = App.getRefWatcher(this);
    refWatcher.watch(this);
}

但是仍然出现“转储内存”错误。请帮忙。

3 个答案:

答案 0 :(得分:1)

您可能知道,

LeakCanary旨在检测应用程序中的内存泄漏。当它显示“正在转储的内存。应用程序冻结。错误”消息时,不是因为您设置的LeakCanary错误,而是因为LeakCanary可以按预期工作并且检测到泄漏。

应用程序冻结,因为LeakCanary必须记录应用程序中每个线程的当前状态和内存,然后向您提供有关检测到的泄漏的报告。

因此,您看到此消息意味着您的应用程序存在内存泄漏,需要修复。在“泄漏” -App,logcat输出或单击弹出的通知中检查您获得的泄漏报告。在该页面中,您应该找到有关泄漏内容的详细信息。

答案 1 :(得分:0)

LeakCanary使用不同类型的依赖项。

debugImplementation "com.squareup.leakcanary:leakcanary-android:1.6.2"
releaseImplementation "com.squareup.leakcanary:leakcanary-android-no-op:1.6.2"
debugImplementation "com.squareup.leakcanary:leakcanary-support-fragment:1.6.2"

如果您的应用处于发布阶段,则lib永远不会出现“正在转储内存。应用冻结。错误”。

这是我初始化LeakCanary的示例。在Application()类中,在方法onCreate()中,我调用

private void initLeakCanary() {
    if (LeakCanary.isInAnalyzerProcess(this))
        return;
    LeakCanary.install(this);
}

答案 2 :(得分:0)

如消息所示,LeakCanary冻结应用程序以转储其当前内存以进行分析。这是正常行为,是有意的。您应该收到有关可能检测到的泄漏的更多详细信息的通知。您还可以查看“泄漏”应用程序或应用程序的logcat输出以获取详细信息。