在附加的堆栈跟踪中获取了资源,但从未释放.有关避免资源泄漏的信息,请参阅java.io.Closable



我在logcat 中收到此消息

在附加的堆栈跟踪中获取了资源,但从未释放。有关避免资源泄漏的信息,请参阅java.io.Closable。

我在哪里寻找泄漏,它是什么意思;请参阅java.io.Closable;。

这意味着您打开了一些东西,但从未关闭它们。Closable有一个方法close,当您不再需要它时,您必须调用它来释放与组件相关的资源

要查找泄漏,可以尝试MAT,我经常使用它来查找内存泄漏(静态数据包含对Activity的引用等)。

对我来说,问题发生的原因是我在没有调用super() 的情况下重写了方法onBackPressed()

@Override
public void onBackPressed() {
    //some coding here
    super.onBackPressed();
}

如果您看到类似以下内容:

10-12 16:46:44.719 2710-2719/? E/StrictMode: A resource was acquired at attached stack trace but never released. See java.io.Closeable for information on avoiding resource leaks.
10-12 16:46:44.719 2710-2719/? E/StrictMode: java.lang.Throwable: Explicit termination method 'end' not called
10-12 16:46:44.719 2710-2719/? E/StrictMode:     at dalvik.system.CloseGuard.open(CloseGuard.java:184)
10-12 16:46:44.719 2710-2719/? E/StrictMode:     at java.util.zip.Inflater.<init>(Inflater.java:82)
10-12 16:46:44.719 2710-2719/? E/StrictMode:     at com.android.okio.GzipSource.<init>(GzipSource.java:57)
10-12 16:46:44.719 2710-2719/? E/StrictMode:     at com.android.okhttp.internal.http.HttpEngine.initContentStream(HttpEngine.java:490)

在您的stacktrace中,旧版本的okhttp中存在一个已知的错误,您可以通过在gradle文件中强制使用新版本来避免这个错误。

编译"com.squareup.okhttp3:okhttp:3.2.0"

至少对我来说,这解决了一个非常相似的问题。

AndroidManifest.xml出现问题时也会显示相同的错误消息。对我来说,<activity>标签意外退出了<application>

这是正确的:

<application ... >
    ...
    <activity ... />
</application>

这将导致启动活动时"在附加的堆栈跟踪中获取了资源,但从未释放"

<application ... >
    ...
</application>
<activity ... />

当我从另一个活动启动第二个活动时发生了这种情况,当时我没有在Application.mk中声明第二个活性。

对我来说,这似乎与模拟器有关,因为它在换到另一个模拟器后消失了。你可以在真实的设备上进行测试。

我的错误是由启用严格模式引起的。当我使用adb在测试手机上进行重新部署时,有些资源没有正确关闭。

我通过从严格模式中删除死刑来"修复"错误:

            StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
                    .detectAll()
                    .penaltyLog()
//                    .penaltyDeath()
                    .build());

最新更新