web-dev-qa-db-ja.com

接続されたスタックトレースでリソースが取得されましたが、解放されませんでした。リソースリークを回避する方法については、Java.io.Closeableを参照してください

logcatでこのメッセージが表示されますリソースはアタッチされたスタックトレースで取得されましたが、リリースされませんでした。リソースリークを回避する方法については、Java.io.Closeableを参照してください。リークの検索場所とその意味「Java.io.Closeableを参照してください」

27
dreamer1989

つまり、何かを開いたが閉じたことはないことを意味します。 Closable メソッドcloseがあります。もう必要ありません。

リークを探すには、 MAT を試してください。メモリリーク(アクティビティへの参照を保持する静的データなど)を見つけるためによく使用します。

13
suitianshi

私にとっては、onBackPressed()を呼び出さずにメソッドsuper()をオーバーライドしていたため、問題が発生しました。

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

次のようなものが表示された場合:

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'をコンパイルします

それは少なくとも私にとって非常に似た問題を解決しました。

5
erbsman

AndroidManifest.xmlに問題がある場合にも、同じエラーメッセージが表示されます。私にとっては、<activity>タグが誤って<application>から外れました

これは正しいです:

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

これにより、アクティビティが開始されたときに「アタッチされたスタックトレースでリソースが取得されたが解放されなかった」になります。

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

<activity ... />
3
ByteHamster

これは、Application.mkで2番目のアクティビティを宣言しなかったときに、別のアクティビティから2番目のアクティビティを起動するときに起こりました。

0
antonkronaj