【问题标题】:A resource was acquired at attached stack trace but never released. See java.io.Closeable for information on avoiding resource leaks在附加的堆栈跟踪中获取了资源,但从未释放。有关避免资源泄漏的信息,请参阅 java.io.Closeable
【发布时间】:2014-10-22 00:48:35
【问题描述】:

我在 logcat 中收到此消息 在附加的堆栈跟踪中获取了资源,但从未释放。有关避免资源泄漏的信息,请参阅 java.io.Closeable。在哪里查找泄漏以及“请参阅 java.io.Closeable”是什么意思

【问题讨论】:

    标签: android android-strictmode


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

        如果你看到类似的东西:

        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)
        

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

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

        这至少为我解决了一个非常相似的问题。

        【讨论】:

        • 我正在使用 3.10.0 但我仍然有这个问题。有什么意见吗?
        • 这个错误发生在带有 Android api 27 的模拟器上,但不是在 api 29 上。
        【解决方案4】:

        当AndroidManifest.xml 出现问题时,也会显示相同的错误消息。对我来说,&lt;activity&gt; 标签不小心脱离了&lt;application&gt;

        这是正确的:

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

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

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

        【讨论】:

          【解决方案5】:

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

          【讨论】:

            【解决方案6】:

            对我来说,这似乎与模拟器有关,因为它通过更改为另一个模拟器而消失了。 你可以在真机上测试。

            【讨论】:

              【解决方案7】:

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

              我通过从严格模式中删除了 deathPenalty 来“修复”了这个错误:

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

              【讨论】:

              • 如果没有注意到quote-unquote,这不是一个正确的解决方法。
              • 我不明白反对意见 - 这个问题出现在各种不同的场景中,我将其发布为对可能修复或至少抑制问题的其他开发人员的帮助,这不是保证修复。
              • 有史以来最好的修复:D
              • 我有点同意 vanomat 的观点。也许这个问题并不总是会杀死应用程序?但对我来说确实如此,最终我想继续前进,因为我找不到源头。除了这个错误不会被忽视之外,我不知道使用penaltyDeath() 有什么好处,但我现在要做的是查看所有堆栈跟踪中的错误,因此应用程序必须为我而死是没有意义的。我当然更想知道是什么原因造成的,但我想每个人的问题根源不同?
              猜你喜欢
              • 1970-01-01
              • 2015-07-16
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多