Что происходит, когда происходит сбой приложения Android при записи в файл? - PullRequest
0 голосов
/ 14 октября 2019

Я новичок в разработке для Android и создаю Flash Card приложение.

Я записываю объект Card в файл с помощью ObjectOutputStream и читаю его с помощью ObjectInputStream.

Я думал, что произойдет, когда приложение пытается записать карту вфайл, обновляя его во временной физической памяти, и пользователь закрывает приложение, когда происходит процесс записи.

Файл будет в несогласованном состоянии и приведет к неожиданным логическим ошибкам в приложении.

ObjectInputStream ois = new ObjectInputStream(openFileInput(FILE_NAME));
Card c = (Card) ois.readObject();
c.foo = foo + 1;
ois.close();

ObjectOutputStream oos = new ObjectOutputStream(openFileOutput(FILE_NAME, MODE_PRIVATE));
// At this point the file will be truncated as the file is opened in write mode
// User closes the application here at this point
// Card has been updated but not stored into the file
oos.writeObject(c);
oos.close();

Можем ли мы сделать эту группу кода атомарной, чтобы даже если пользователь закрылприложение между, все изменения будут откатаны?

Или мы можем запретить пользователю останавливать приложение на этом этапе?

Закрывая приложение, я имею в виду уничтожение приложения, но я хотел бы знать, что происходит в других случаях, например нажатиекнопка возврата, нажатие кнопки домой и т. д.

1 Ответ

0 голосов
/ 14 октября 2019

Дисковый ввод-вывод выполняется в фоновом потоке, чтобы не заморозить интерфейс. Теперь существует 3 сценария:

  1. Приложение переходит в фоновый режим (пользователь нажимает кнопку «Домой»), фоновый поток (BT) будет продолжать работать.
  2. Приложение воссоздается (пользователь поворачивает устройство), здесь также ваш фоновый поток будет продолжать работать. Но поскольку ваш экземпляр активности, который породил BT, больше не активен, поэтому вы не можете обновить любое состояние просмотра.
  3. Приложение уничтожено, в этом случае фоновый поток также будет уничтожен, так что да, ваш файл будет впротиворечивое состояние. Что вы можете сделать, чтобы противостоять этому, так это использовать Service (если ваш ввод / вывод очень длинный). Вы можете прочитать больше об этом здесь. Использование службы для фоновой задачи.

Однако, если ваша задача не длинная (занимает всего 1-2 секунды), с BT вам будет хорошо.

Это ваши варианты, чтобы сохранить задачу, если ваше приложение отодвинуто на задний план или убито.

Но вы также можете структурировать свои данные, чтобы покрыть такие нежелательные сценарии.

Например, вы можете вернуть логическое значение после записи вашей карты в файл и сохранить это логическое значение в общих настройках.

Если у вас есть несколько карточек для записи в один файл, то при открытии файла используйте режим Добавить, назначьте уникальный ключ вашим карточкам и можете сохранить успешно записанные ключи карточки в общих настройках. Таким образом, читая ключи из общих настроек, вы можете узнать, какие карточки были успешно записаны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...