Объектный файл Android становится поврежденным - PullRequest
1 голос
/ 28 апреля 2011

Я новичок в разработке для 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

Итак, я предполагаю, что есть проблема с памятью, но я все еще не понимаю, почему это происходит с таким небольшим количеством данных. Я рассмотрю использование БД, но буду признателен за любые идеи о том, что является причиной этого.

Ответы [ 3 ]

1 голос
/ 28 апреля 2011

Возможно, у вас проблемы с памятью при сериализации вашего объекта.Вы пробовали использовать базу данных?

Было бы также полезно, если бы вы указали какие-либо ошибки, полученные вами от LogCat.

0 голосов
/ 04 октября 2013

В моем случае проблема заключалась в том, что я иногда мог читать и писать асинхронно . Файл будет перезаписан в середине чтения, вызывая EOFException или внутренний IndexOutOfBounds в «readObject ()».

Добавление синхронизированных ко всем моим методам чтения и записи работало для меня.

0 голосов
/ 29 апреля 2011

Думаю, этот вопрос может вас заинтересовать: StackOverflowError при сериализации объекта в Java

Самое простое решение: не сериализовать массивы.Рассмотрите возможность использования базы данных или простых файлов данных.

...