【问题标题】:Java RandomAccessFile A resource was acquired at attached stack trace but never releasedJava RandomAccessFile 在附加的堆栈跟踪中获取了资源,但从未释放
【发布时间】:2016-11-07 03:20:10
【问题描述】:

好吧,这很奇怪。

我有一个 Android 应用程序,它将用户在键盘上键入的所有内容保存在一个文件 (buffered.log) 中。一切都运行良好,除了客户将应用程序安装在他们之前安装的手机上的奇怪情况。

然后应用程序抛出此错误:

03 20:20:34.678 22741-22749/com.menny.android.anysoftkeyboard 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:180)
at java.io.RandomAccessFile.<init>(RandomAccessFile.java:127)
at com.radicalninja.logger.FlushableCipherOutputStream.<init>(FlushableCipherOutputStream.java:50)
at com.radicalninja.logger.CipherUtils.flushableEncryptedBufferedWriter(CipherUtils.java:31)
at com.radicalninja.logger.FileWriter.openFileWriter(FileWriter.java:41)
at com.radicalninja.logger.FileWriter.<init>(FileWriter.java:30)
at com.radicalninja.logger.FileWriter.<init>(FileWriter.java:0)
at com.radicalninja.logger.LogManager.openExternalPublicStorage(LogManager.java:161)
at com.radicalninja.logger.LogManager.createFileWriter(LogManager.java:115)
at com.radicalninja.logger.LogFileController.openLogFile(LogFileController.java:18)
at com.radicalninja.logger.LogFileController.<init>(LogFileController.java:12)
at com.radicalninja.logger.Buffer.<init>(Buffer.java:0)
at com.radicalninja.logger.WordBuffer.<init>(WordBuffer.java:0)
at com.anysoftkeyboard.AnySoftKeyboard.onCreate(AnySoftKeyboard.java:328)
at android.app.ActivityThread.handleCreateService(ActivityThread.java:3808)
at android.app.ActivityThread.access$2100(ActivityThread.java:222)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1883)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:158)
at android.app.ActivityThread.main(ActivityThread.java:7229)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)

我的问题是:我如何检查随机访问文件是否未正确关闭,并在应用程序尝试创建与先前安装相同的新 RandomAccessFile 之前关闭它?

【问题讨论】:

  • 更中肯的问题是你为什么不释放资源?
  • 嗨 EJP,资源未被释放的原因是因为缓冲区在应用程序运行以捕获键盘输入时永久保持打开状态,每两小时关闭一次,上传单词缓冲区到 AWS,然后缓冲区文件再次打开。
  • 对客户来说一切正常,除非客户不小心在已经安装了它的手机上再次安装了该应用程序。这不是一个常见问题(在数百次安装中出现一次),只是试图追踪所有可能的问题

标签: java android


【解决方案1】:

好的,这是我解决这个问题的方法:

在应用第一次打开时创建具有相同路径的新文件,然后将其删除。

似乎工作,但似乎不是很优雅

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-22
    • 1970-01-01
    相关资源
    最近更新 更多