W/システム: リソースの解放呼び出しに失敗しました 質問する

W/システム: リソースの解放呼び出しに失敗しました 質問する

私のアプリで AndroidStudio のコンソールを使用すると、次のように表示されます。

W/システム: リソースが解放の呼び出しに失敗しました。

複数回言われることもあります。意味はわかりますが、約 2,000 行のコードを何度もチェックしましたが、閉じる/解放するために何が足りないのかわかりません。

コンソールからこの情報を拡張する方法はありますか?または、リソースが何であるか、またはリソースが閉じられない場合にターゲットを設定するにはどうすればよいでしょうか? どのようなアイデアでも歓迎します。 ありがとうございます。

ベストアンサー1

@guestからの回答は機能しますが、リフレクションに頼らずにまったく同じことを実現できます。厳密モード具体的には、次のようになります。

StrictMode.setVmPolicy(new VmPolicy.Builder()
                 .detectLeakedClosableObjects()
                 .penaltyLog()
                 .build());

一般的に、厳密モードではさらに多くのことが可能になります (ドキュメントへの上記のリンクを参照)。デフォルトの設定で必要なことは次のとおりです。

StrictMode.enableDefaults();  # <-- This includes warning on leaked closeables

厳密モードを「できるだけ早く」有効にするには、上記のコード オプションのいずれかをアプリケーション クラスのコンストラクターに追加します。例:

public class MyApp extends Application {

    public MyApp() {
        if(BuildConfig.DEBUG)
            StrictMode.enableDefaults();
    }

}

上記のクラスを作成するだけでなく、カスタム アプリケーション クラスを作成したことを Android に通知する必要があることに注意してくださいAndroidManifest.xml(これにより、Android がデフォルト クラスを作成するのではなく、アプリケーション プロセスの開始時にそのインスタンスが作成されます)。カスタム アプリケーション クラスの完全に解決されたパッケージ パスを指すように、タグの属性Applicationを追加/変更する必要があります(この場合は次のようになります)。android:name<application>MyApp

<application
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:name="com.example.app.MyApp"  <-- IMPORTANT PART: ADAPT FOR YOUR ACTUAL PROJECT
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">

おすすめ記事