Я новичок в разработке для Android и пытаюсь создать несколько базовых приложений, чтобы привыкнуть к платформе. У меня есть базовое приложение, которое позволяет пользователю вводить слова с определениями. Основным представлением является просмотр списка, который заполняется ArrayAdapter, который подается из ArrayList. Когда пользователь решает добавить слово, он может ввести имя и определение, а если этого имени еще нет в списке, оно добавляется в список. Имя и определение затем помещаются в объект Word (пользовательский объект, который реализует связанный список для ссылки на все слова, которые были введены). Эта часть программы работает нормально, я могу добавить столько слов, сколько захочу, проблема с сохранением. У меня есть ссылка на корень моего связанного списка объектов word в объекте под названием wordlist (этот объект также содержит ArrayList). Я реализовал Serializeable со всеми моими объектами, и мой план состоял в том, чтобы сохранять весь объект списка слов каждый раз, когда добавляется слово. Чтобы сделать это, я реализовал в своей активности 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-е слово, которое я пытаюсь добавить с помощью силы, не закроет программу. Затем, когда я попытаюсь открыть его снова, он закроется, как только появится. Это также странно для меня, потому что у меня есть метод try catch в методе onCreate начальной операции, который должен отследить любую проблему с файлом и просто воссоздать объект:
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();
}
Если я зайду в свои приложения на телефоне и очисту данные, он сможет начать резервное копирование. Я не мог найти никого, у кого была похожая проблема (насколько я мог судить). Я попытался закомментировать раздел вывода файла, и все работает отлично, он просто не сохранится. Любые идеи очень приветствуются. (Если неясно, я пытаюсь сохранить локально в своей программе).
Моя среда разработки: Windows 7 64-битная, Eclipse 64-битная, Java 64-битная (я знаю, что у некоторых людей были проблемы с 64-битной Java и Eclipse, но я смог разработать другие программы на Java и Android в этой среде). Я использовал эмулятор обновления 1 для Android 2.1, и он делает то же самое в эмуляторе. У меня также был телефон Android 2.1 с обновлением 1, у которого была та же проблема, с тех пор я обновился до 2.2 и все еще та же проблема.
UPDATE:
Спасибо за ответы, я посмотрел журнал, и вот что я получил, когда программа потерпела крах:
04-28 18: 04: 27.629: ОШИБКА / AndroidRuntime (16570): ИСКЛЮЧИТЕЛЬНОЕ ИСКЛЮЧЕНИЕ: main
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
Итак, я предполагаю, что есть проблема с памятью, но я все еще не понимаю, почему это происходит с таким небольшим количеством данных. Я рассмотрю использование БД, но буду признателен за любые идеи о том, что является причиной этого.