W/System:资源调用释放失败

在我的应用程序上使用 AndroidStudio 的控制台时,它显示:

W/System:资源调用释放失败。

有时会说很多遍。我知道这意味着什么,但我已经多次检查了近 2k 行代码,但我不知道我缺少什么来关闭/发布。

有什么方法可以从控制台扩展此信息?或者您将如何定位资源是什么或何时无法关闭?欢迎任何想法。谢谢。


郎朗坤
浏览 149回答 5
5回答

吃鸡游戏

您可以在不使用Strict Mode进行反射的情况下实现完全相同的结果。具体来说,是这样的:StrictMode.setVmPolicy(new VmPolicy.Builder()&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;.detectLeakedClosableObjects()&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;.penaltyLog()&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;.build());一般来说,严格模式可以为您做更多事情(参见上面的文档链接),对于默认设置,您需要做的就是:StrictMode.enableDefaults();&nbsp; # <-- This includes warning on leaked closeables要“尽快”启用严格模式,您可以将上述任一代码选项添加到应用程序类的构造函数中,例如:public class MyApp extends Application {&nbsp; &nbsp; public MyApp() {&nbsp; &nbsp; &nbsp; &nbsp; if(BuildConfig.DEBUG)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; StrictMode.enableDefaults();&nbsp; &nbsp; }}请注意,除了只创建上面的类之外,您还需要告诉 Android 您已经在其中创建了一个自定义应用程序类AndroidManifest.xml(以便在您的应用程序进程启动时创建它的实例,而不是 Android 创建默认Application类)。您需要添加/修改标签android:name的属性<application>以指向您的自定义应用程序类(MyApp在本例中)的完全解析包路径:<application&nbsp; &nbsp; android:icon="@mipmap/ic_launcher"&nbsp; &nbsp; android:label="@string/app_name"&nbsp; &nbsp; android:name="com.example.app.MyApp"&nbsp; <-- IMPORTANT PART: ADAPT FOR YOUR ACTUAL PROJECT&nbsp; &nbsp; android:roundIcon="@mipmap/ic_launcher_round"&nbsp; &nbsp; android:supportsRtl="true"&nbsp; &nbsp; android:theme="@style/AppTheme">

叮当猫咪

此消息来自dalvik.system.CloseGuard。调试时,您可以将其设置为在创建资源时创建堆栈跟踪,以便您可以追踪哪些对象没有被关闭。它不是框架 API 的一部分,所以我使用反射来打开它:try {&nbsp; &nbsp; Class.forName("dalvik.system.CloseGuard")&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .getMethod("setEnabled", boolean.class)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .invoke(null, true);} catch (ReflectiveOperationException e) {&nbsp; &nbsp; throw new RuntimeException(e);}更多信息:https://wh0.github.io/2020/08/12/closeguard.html

有只小跳蛙

我不认为您可以从 Logcat 中获得更多信息。Android Profiler的内存视图可能是一个很好的起点。在使用您的应用程序时查看它应该可以让您了解哪些操作会导致内存被分配而不是被释放。您还可以从时间轴中选择部分,并按类别深入到特定分配。另外,LeakCanary是一个检测内存泄漏的好库。

心有法竹

通过删除通过另一个函数调用自身的函数调用来修复它,从而对自身进行无限循环调用

哔哔one

迟到的答案,但它可能对其他人有用:我遇到了同样的错误,但我忘记了我的 VPN 在后台运行。断开 VPN 对我有用。这就是说,这可能是由于与您的应用程序或您可能想要检查的 IDE 无关的资源造成的,例如防病毒软件、VPN 等。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java