首页 > 解决方案 > 当 Android 应用程序在写入文件时崩溃时会发生什么?

问题描述

我是 Android 开发的新手,我正在制作类似闪存卡的应用程序。

我正在使用将 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();

我们能否让这组代码原子化,这样即使用户在两者之间关闭了应用程序,所有的更改也会被回滚?

或者我们可以不允许用户此时停止应用程序吗?

通过关闭应用程序,我的意思是杀死应用程序,但我想知道在其他情况下会发生什么,比如按下后退按钮、按下主页按钮等。

标签: androidfile

解决方案


磁盘 I/O 在后台线程上完成,以免冻结 UI。现在有3种情况:

  1. 应用程序进入后台(用户按下主页按钮),您的后台线程(BT)将继续运行。
  2. 应用程序被重新创建(用户旋转设备),您的后台线程也将继续运行。但是因为您生成 BT 的活动实例不再存在,所以您无法更新任何视图状态。
  3. 应用程序被杀死,在这种情况下,您的后台线程也将被杀死,所以是的,您的文件将处于不一致状态。你可以做的就是使用服务(如果你的 I/O 真的很长)。您可以在此处阅读有关此内容的更多信息。将服务用于后台任务。

但是,如果您的任务不长(只需 1-2 秒),那么您可以使用 BT。

如果您的应用程序被推到后台或被终止,这些是您保持任务持续进行的选项。

但您也可以构建数据以涵盖此类不需要的场景。

例如,您可以在将卡片写入文件并将该布尔值保存到共享首选项后返回一个布尔值。

如果您有多个卡要写入单个文件,则在打开文件时使用模式附加,并为您的卡分配一个唯一的密钥,并可以将成功写入的卡密钥保存到共享首选项。因此,通过从共享首选项中读取密钥,您可以了解哪些卡已成功写入。


推荐阅读