如标题所述。在我的应用上使用AndroidStudio控制台时,它显示:
W /系统:资源无法调用释放。
有时要多次说。我知道这是什么意思,但是我已经多次检查了将近2k行代码,但是对于关闭/释放丢失的内容我一无所知。
是否可以通过控制台扩展此信息??或者,您将如何确定资源是什么?或在资源关闭失败时如何定位?任何想法都欢迎。谢谢。
答案 0 :(得分:6)
此消息来自dalvik.system.CloseGuard
。调试时,可以将其设置为在创建资源时创建堆栈跟踪,以便可以跟踪哪些对象没有关闭。
它不是框架API的一部分,因此我使用反射将其打开:
try {
Class.forName("dalvik.system.CloseGuard")
.getMethod("setEnabled", boolean.class)
.invoke(null, true);
} catch (ReflectiveOperationException e) {
throw new RuntimeException(e);
}
答案 1 :(得分:2)
我认为您无法从Logcat中获取更多信息。
Android Profiler的内存视图可能是一个不错的起点。在使用您的应用程序时查看它可以使您了解哪些操作会导致分配和释放内存。 您还可以从时间轴中选择各个部分,然后按以下方式细分到特定分配 课。
答案 2 :(得分:1)
@guest的答案有效,但是您可以实现完全相同的事情,而无需借助Strict Mode进行反思。具体来说,是这样的:
StrictMode.setVmPolicy(new VmPolicy.Builder()
.detectLeakedClosableObjects()
.penaltyLog()
.build());
通常,严格模式可以为您做更多的事情(请参阅上面的文档链接),默认设置所需要做的就是:
StrictMode.enableDefaults(); # <-- This includes warning on leaked closeables
答案 3 :(得分:0)
@guest答案更大,但无法使用
快速可用的变体 functionNameWhenMaybyFogetclose()-当maby不是.close()
时,简单插入 function 或 codetry {
Class.forName("dalvik.system.CloseGuard")
.getMethod("setEnabled", Boolean::class.javaPrimitiveType)
.invoke(null, true)
functionNameWhenMaybyFogetclose() // Insert tested function(method) or code
} catch (e: ReflectiveOperationException) {
throw RuntimeException(e)
}
答案 4 :(得分:0)
迟到的答案,但可能对其他人有用:
我遇到了同样的错误,但我忘记了我的 VPN 在后台运行。断开 VPN 连接对我有用。 也就是说,这可能是由于与您的应用或 IDE 无关的资源,您可能想要检查,例如防病毒软件、VPN 等。
答案 5 :(得分:0)
通过删除通过另一个函数调用自身的函数调用来修复它,从而对自身进行无限循环调用