0

对于我的应用程序,我使用三个文件来存储本地数据,其中两个在应用程序启动时进行检查并远程更新(如果有更新的版本可用或文件尚不存在)。第三个是可以在应用程序运行时定期存储的用户数据。

这三个都使用相同的方法来保存文件:

    public boolean setLocalFile(String Filename, String FileText, Context con) {
    try {
        FileOutputStream fos = con.openFileOutput(Filename, Context.MODE_PRIVATE);
        fos.write(FileText.getBytes());
        fos.close();
        return true;
    } catch(Exception e) {
        handleError(e); // local method that simply does a System.out.println
        return false;
    }
}

现在第三个文件写得很好,但前两个(在启动时检查并写入)根本不写。在调试中,似乎完全跳过了 setLocalFile 方法而没有引发异常或使应用程序崩溃,并且报告的唯一错误日志似乎是:

07-11 16:14:13.162: ERROR/AndroidRuntime(1882): ERROR: thread attach failed
07-11 16:14:18.882: ERROR/gralloc(62): [unregister] handle 0x3bfe40 still locked (state=40000001)

不幸的是,我也没有在网上找到任何有用的东西。

这让我很困惑——我不知道为什么在这种特殊情况下不写。有任何想法吗?

4

1 回答 1

0

迟来的更新...给出发生此问题的代码可能不太实用,因为我怀疑实际上需要我的所有代码来全面检查它。

我的变量名以大写字母开头,主要是因为我在使用其他语言大约 10 年后才再次回到 Java,所以我花了一段时间才重新开始工作 - 不漂亮,但如果我会感到惊讶它会有所作为。尽管如此,谢谢大家的回复。

问题的背景是我决定将这些文件中保存的数据作为类对象处理。因此,Drafts 对象将保存所有草稿文档,类构造函数将调用 getLocalFile 方法并将其本地存储在类中,允许我使用它(使用各种 get/set 类型方法),然后再次将其写入文件使用“提交”方法(调用 setLocalFile)。

有各种这样的类对象被调用,但每个数据文件实例化的对象不超过一个。让我难过的是一切都运行良好,除了 FS 操作被简单地忽略了。一旦我直接访问文件(忽略我编写的类包装器),问题就消失了。

类包装器在应用程序的其他部分工作正常,这个问题只发生在其中一个复杂且相当密集的部分。

正如我所说,我只是在长时间缺席(并且发生了很大变化)后才回到 Java,但是看看这个问题以及它如何“解决”本身,我的猜测是它是某种形式的线程/内存问题 -本质上,我从太多对象访问 FS,最终它决定不再玩了。

正如我所说,这个问题已经解决了,但让我感到困扰的是,该解决方案不允许我更优雅地包装我的数据对象。如果有人可能会提出可能的原因/解决方案,我会很乐意尝试并报告,否则此响应可能会帮助将来遇到类似问题的人 - 至少找到一个不雅的解决方案......

于 2011-09-08T09:40:01.493 回答