我是android开发的新手,一直在尝试创建一些基本的应用程序来适应这个平台。我有一个基本的应用程序,允许用户输入带有定义的单词。主视图是一个由ArrayList提供的ArrayAdapter填充的列表视图。当用户选择添加单词时,他们可以输入名称和定义,如果该名称不在列表中,则会将其添加到列表中。然后将名称和定义放入Word对象(实现链接列表以引用已输入的所有单词的自定义对象)。程序的这一部分运行良好,我可以添加任意多的单词,问题在于保存。我在一个名为wordlist的对象中引用了单词对象链表的根(这个对象还包含ArrayList)。我已经用我的所有对象实现了Serializable,我的计划是每次添加单词时都保存整个单词列表对象。为此,我在Add_Word活动(当用户选择添加单词时调用的活动)中实现了以下内容:
try
{
FileOutputStream fileOut = openFileOutput("words.obj", Context.MODE_PRIVATE);
ObjectOutputStream objectOut = new ObjectOutputStream(fileOut);
objectOut.writeObject(Activity_Main.wordlist);
objectOut.close();
fileOut.close();
}
catch (IOException e)
{
Context context = getApplicationContext();
CharSequence text = "File Error";
int duration = Toast.LENGTH_SHORT;
Toast toast = Toast.makeText(context, text, duration);
toast.show();
}
现在,这段代码似乎在大多数情况下都能正常工作,我可以毫无问题地保存和加载我的单词,直到出于某种原因,我试图添加的第22个单词强制关闭程序。然后,当我再次尝试打开它时,它会在弹出时立即强制关闭。这对我来说也很奇怪,因为我在启动活动的onCreate方法中有一个try-catch语句,它应该可以捕获文件的任何问题,并简单地重新创建对象:
try
{
FileInputStream fileIn = this.openFileInput("words.obj");
ObjectInputStream objectIn = new ObjectInputStream(fileIn);
wordlist = (Words) objectIn.readObject();
objectIn.close();
fileIn.close();
}
catch (Exception e)
{
wordlist = new Words();
}
如果我进入手机上的应用程序并清除数据,它就可以启动备份。我找不到有类似问题的人(据我所知)。我确实试着注释掉了文件输出部分,一切都很好,只是无法保存。任何想法都将不胜感激。(如果不清楚我正在尝试本地保存到我的程序中)。
我的开发环境:Windows7 64位、Eclipse 64位、Java 64位(我知道有些人对64位Java和Eclipse有问题,但我已经能够在这个环境中开发其他Java和Android程序)。我使用了Android 2.1更新1模拟器,它在模拟器中也做了同样的事情。我也有一部安卓2.1更新1的手机出现了同样的问题,我已经更新到2.2,但仍然存在同样的问题。
更新:感谢您的回复,我查看了日志,这是程序崩溃时我得到的:
04-28 18:04:27.629:错误/AndroidRuntime(16570):致命异常:主
04-28 18:04:27.629:错误/AndroidRuntime(16570):java.lang.StackOverflowError
04-28 18:04:27.629:错误/AndroidRuntime(16570):在java.util.IdentityHashMap.findIndex(IdentityHashMap.java:419)
04-28 18:04:27.629:错误/AndroidRuntime(16570):在java.util.IdentityHashMap.get(IdentityHashMap.java:371)
04-28 18:04:27.629:错误/AndroidRuntime(16570):在java.io.ObjectOutputStream.dumpCycle(ObjectOutputStream.java:478)
04-28 18:04:27.629:错误/AndroidRuntime(16570):在java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.java:1751)
04-28 18:04:27.629:错误/AndroidRuntime(16570):在java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1701)
04-28 18:04:27.629:错误/AndroidRuntime(16570):在java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1665)
04-28 18:04:27.629:错误/AndroidRuntime(16570):在java.io.ObjectOutputStream.writeFieldValues(ObjectOutputStream.java:1153)
04-28 18:04:27.629:错误/AndroidRuntime(16570):在java.io.ObjectOutputStream.defaultWriteObject(ObjectOutputStream.java:420)
04-28 18:04:27.629:错误/AndroidRuntime(16570):在java.io.ObjectOutputStream.writeHierarchy(ObjectOutputStream.java:1251)
04-28 18:04:27.629:错误/AndroidRuntime(16570):在java.io.ObjectOutputStream.writeNewObject(ObjectOutputStream.java:1587)
04-28 18:04:27.629:错误/AndroidRuntime(16570):在java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.java:1859)04-28 18:04:27.629:错误/AndroidRuntime(16570):在java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1701)
04-28 18:04:27.629:错误/AndroidRuntime(16570):在java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1665)
04-28 18:04:27.629:错误/AndroidRuntime(16570):在java.io.ObjectOutputStream.writeFieldValues(ObjectOutputStream.java:1153)
04-28 18:04:27.629:错误/AndroidRuntime(16570):在java.io.ObjectOutputStream.defaultWriteObject(ObjectOutputStream.java:420)
04-28 18:04:27.629:错误/AndroidRuntime(16570):在java.io.ObjectOutputStream.writeHierarchy(ObjectOutputStream.java:1251)
04-28 18:04:27.629:错误/AndroidRuntime(16570):在java.io.ObjectOutputStream.writeNewObject(ObjectOutputStream.java:1587)
04-28 18:04:27.629:错误/AndroidRuntime(16570):在java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.java:1859)
04-28 18:04:27.629:错误/AndroidRuntime(16570):在java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1701)
04-28 18:04:27.629:错误/AndroidRuntime(16570):在java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1665)
04-28 18:04:27.629:错误/AndroidRuntime(16570):在java.io.ObjectOutputStream.writeFieldValues(ObjectOutputStream.java:1153)
04-28 18:04:27.629:错误/AndroidRuntime(16570):在java.io.ObjectOutputStream.defaultWriteObject(ObjectOutputStream.java:420)
04-28 18:04:27.629:错误/AndroidRuntime(16570):在java.io.ObjectOutputStream.writeHierarchy(ObjectOutputStream.java:1251)
04-28 18:04:27.629:错误/AndroidRuntime(16570):在java.io.ObjectOutputStream.writeNewObject(ObjectOutputStream.java:1587)
04-28 18:04:27.629:错误/AndroidRuntime(16570):在java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.java:1859)
04-28 18:04:27.629:错误/AndroidRuntime(16570):在java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1701)
04-28 18:04:27.629:错误/AndroidRuntime(16570):在java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1665)
04-28 18:04:27.629:错误/AndroidRuntime(16570):在java.io.ObjectOutputStream.writeFieldValues(ObjectOutputStream.java:1153)
04-28 18:04:27.629:错误/AndroidRuntime(16570):在java.io.ObjectOutputStream.defaultWriteObject(ObjectOutputStream.java:420)
04-28 18:04:27.629:错误/AndroidRuntime(16570):在java.io.ObjectOutputStream.writeHierarchy(ObjectOutputStream.java:1251)
04-28 18:04:27.629:错误/AndroidRuntime(16570):在java.io.ObjectOutputStream.writeNewObject(ObjectOutputStream.java:1587)
04-28 18:04:27.629:错误/AndroidRuntime(16570):在java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.java:1859)
04-28 18:04:27.629:错误/AndroidRuntime(16570):在java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1701)
04-28 18:04:27.629:错误/AndroidRuntime(16570):在java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1665)
04-28 18:04:27.629:错误/AndroidRuntime(16570):在java.io.ObjectOutputStream.writeFieldValues(ObjectOutputStream.java:1153)
04-28 18:04:27.629:错误/AndroidRuntime(16570):在java.io.ObjectOutputStream.defaultWriteObject(ObjectOutputStream.java:420)
04-28 18:04:27.629:错误/AndroidRuntime(16570):在java.io.ObjectOutputStream.writeHierarchy(ObjectOutputStream.java:1251)
04-28 18:04:27.629:错误/AndroidRuntime(16570):在java.io.ObjectOutputStream.writeNewObject(ObjectOutputStream.java:1587)
04-28 18:04:27.629:错误/AndroidRuntime(16570):在java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.java:1859)
04-28 18:04:27.629:错误/AndroidRuntime(16570):在java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1701)
04-28 18:04:27.629:错误/AndroidRuntime(16570):在java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1665)
04-28 18:04:27.629:错误/AndroidRuntime(16570):在java.io.ObjectOutputStream.writeFieldValues(ObjectOutputStream.java:1153)
04-28 18:04:27.629:错误/AndroidRuntime(16570):在java.io.ObjectOutputStream.defaultWriteObject(ObjectOutputStream.java:420)
04-28 18:04:27.629:错误/AndroidRuntime(16570):在java.io.ObjectOutputStream.writeHierarchy(ObjectOutputStream.java:1251)
04-28 18:04:27.629:错误/AndroidRuntime(16570):在java.io.ObjectOutputStream.writeNewObject(ObjectOutputStream.java:1587)
04-28 18:04:27.629:错误/AndroidRuntime(16570):在java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.java:1859)
04-28 18:04:27.629:错误/AndroidRuntime(16570):在java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1701)
04-28 18:04:27.629:错误/AndroidRuntime(16570):在java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1665)
04-28 18:04:27.629:错误/AndroidRuntime(16570):在java.io.ObjectOutputStream.writeFieldValues(ObjectOutputStream.java:1153)
04-28 18:04:27.629:错误/AndroidRuntime(16570):在java.io.ObjectOutputStream.defaultWriteObject(ObjectOutputStream.java:420)
04-28 18:04:27.629:错误/AndroidRuntime(16570):在java.io.ObjectOutputStream.writeHierarchy(ObjectOutputStream.java:1251)
04-28 18:04:27.629:错误/AndroidRuntime(16570):在java.io.ObjectOutputStream.writeNewObject(ObjectOutputStream.java:1587)
04-28 18:04:27.629:错误/AndroidRuntime(16570):在java.io.ObjectOutputStream.writeObjectInternal(ObjectOut
因此,我假设存在内存问题,但我仍然困惑于为什么在如此少量的数据中会发生这种情况。我会研究使用DB,但我希望能有更多关于造成这种情况的想法。
序列化对象可能会遇到内存问题。你用数据库试过吗?
如果你能包括你从LogCat得到的任何错误,这也会很有帮助。
我想这个问题可能会引起你的兴趣:在Java 中序列化对象时发生StackOverflow错误
最简单的解决方案:不要序列化数组列表。考虑使用数据库或简单的数据文件。
在我的案例中,问题是有时我可能会异步读写。该文件将在读取过程中被覆盖,从而导致EOFException或"readObject()"中的内部IndexOutOfBounds。
将同步添加到我所有的读写方法中对我有效。