我已经开发了几个星期的Android应用程序,并且时不时地看到这个问题:
06-24 14:04:48.915 1530-1539/android.process.acore E/StrictMode﹕ A resource was acquired at attached stack trace but never released. See java.io.Closeable for information on avoiding resource leaks.
java.lang.Throwable: Explicit termination method 'close' not called
at dalvik.system.CloseGuard.open(CloseGuard.java:184)
at android.os.ParcelFileDescriptor.<init>(ParcelFileDescriptor.java:180)
at android.os.ParcelFileDescriptor$1.createFromParcel(ParcelFileDescriptor.java:916)
at android.os.ParcelFileDescriptor$1.createFromParcel(ParcelFileDescriptor.java:906)
at android.app.IBackupAgent$Stub.onTransact(IBackupAgent.java:57)
at android.os.Binder.execTransact(Binder.java:446)
我能想到的唯一一件事就是我在浏览器中使用以下代码打开网址:
ClickableSpan clickableSpan = new ClickableSpan() {
@Override
public void onClick(View textView) {
Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.practiceadmin.com/legal/"));
browserIntent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
startActivity(browserIntent);
}
};
奇怪的是,当我打开我的android.os.ParcelFileDescriptor.java文件时,它表示对于import语句:
import dalvik.system.CloseGuard;
import libcore.io.IoUtils;
import libcore.io.Memory;
它无法解析符号&#39; CloseGaurd&#39; libcore&#39;。 任何解决这个问题的方向都将非常感激。
答案 0 :(得分:0)
这只是我对这个问题的研究报告 - 还不是答案。
最近在相关帖子中报告了此问题:例如,here,here和here。
我有一个启用了BackupAgent的应用。当我最近启用StrictMode时,我开始看到此帖子和其他帖子中包含相同的CloseGuard异常,其中包括堆栈跟踪中的IBackupAgent。所以我认为我的BackupAgent出现了问题。
我看到我忽略了在BackupAgent的onBackup()
方法中关闭ParcelFileDesciptors,所以添加了这些语句:
// if there is no prior state, oldState is null
if (oldState != null) {
oldState.close();
}
newState.close();
随着这一变化,随机异常仍在继续。然后我注意到在该问题的其他一些报告中,OP是新的Android开发人员,可能还没有为他们的应用程序创建BackupAgent。这导致我怀疑资源泄漏是在BackupService的框架代码中,或者是由其他应用程序中的BackupAgents引起的。 this crash的logcat显示DictionaryBackupAgent
处于活动状态。
我不太了解应用程序组件的StrickMode设置传播的程度。 StrictMode documentation表示&#34;它在进行Binder调用时确实跨越进程边界传播其状态&#34;。这表明应用程序的StrictMode设置可能比预期的要大。这些崩溃可能在任何时候启用StrictMode并发生备份时发生,并且可能不是由报告它们的应用程序代码引起的。