在Android上保存文件时避免因中断而丢失数据?

2024-05-05

我想知道其他人在 Android 上保存文件时使用什么策略来避免数据丢失。我有几个游戏应用程序,本质上,它们可能会在用户暂停(onPause)时保存游戏状态/保存游戏。

这在 99.99% 的情况下有效,但每隔一段时间我就会收到一个保存游戏的例子,其中保存过程出错了。通常,这是一个格式不正确的 XML 文件,通常会在某个任意点被截断。根据我收到的错误报告,我认为问题主要发生在用户在游戏过程中被电话或类似情况打断时,Android 操作系统会在应用程序完成保存之前杀死该应用程序。保存文件的代码非常简单,因此我很难看出还有什么可能导致此问题。

这是一个严重的问题,因为它通常会导致玩家的保存进度被破坏。

我想先写入一个空文件,然后再复制到“真实”文件,但我怀疑这只会增加问题,因为它总体上会花费更多时间,并且仍然有被中断的风险。

谁有一种安全的方法来做到这一点,Android相对保证不会搞砸?


总结一下,到目前为止建议的选项(据我所知):

  1. 使用服务进行保存过程,假设该服务不太可能被操作系统终止。
  2. 保存在临时文件中;验证保存后复制。
  3. 增量保存游戏状态(实际上我已经将其用于玩家日志信息)。
  4. 2 和 3 的组合。
  5. 将保存移至另一个线程,因为问题可能出在 ANR 终止上 [DC 的评论如下]。

我认为 SharedPreferences 不适用于这种结构化数据,目前,这两种方法似乎都不是理想的解决方案,所以我仍然愿意接受建议。


我还没有设法测试所有这些方法,因此,为了避免浪费赏金,我将其分配给我认为最有可能解决问题的答案。不过,在接受答案之前,我仍然计划检查各种选项。感谢所有好的建议。


对于服务业来说,这听起来是一份不错的工作。

http://developer.android.com/reference/android/app/Service.html http://developer.android.com/reference/android/app/Service.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在Android上保存文件时避免因中断而丢失数据? 的相关文章

随机推荐

  • 通过提供邮政编码获取城市名称的网络服务[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我需要一个可靠的网络服务 它通过传递邮政编码给出相应的城市名称 该网络服务应该随时可用 该网络服务也将在生产中使用 我发现了几种使用基于
  • 更改 EF Power Tools Beta 3 中生成的文件名

    我已经搜索过但无法找到这个问题的答案 目前我们的数据库用户表的前缀 例如tblUsers 我已更新 EF 模板以从生成的类名称中删除 tbl 但是我仍然不知道如何更改输出文件名以匹配 有可能吗 还是我在向月亮祈求 我正在 VS 2012 中
  • 为什么 T-SQL 块即使不应该执行也会给出错误?

    我正在编写一个 看似 直接的 SQL 片段 它在确保列存在后删除该列 问题 如果该列不存在 则代码insideIF 子句抱怨它找不到该列 出色地 doh 这就是为什么它位于 IF 子句内 所以我的问题是 为什么一段不应该执行的代码会出错 这
  • 如何不自动取消引用 Google App Engine 中的 db.ReferenceProperty?

    假设我有 class Foo db Model bar db ReferenceProperty Bar foo Foo all get 有没有办法让我在不向数据存储区进行查询的情况下执行 foo bar 操作 文档说foo bar将是一个
  • 如何将 Font Awesome 4.3.0 与 JSF 集成?

    我已经尝试过这个方法 如何将 webjars org 中的 Font Awesome 与 JSF 结合使用 https stackoverflow com questions 18891768 how to use font awesome
  • Spark:如何从spark shell运行spark文件

    我正在使用CDH 5 2 我能够使用火花外壳运行命令 如何运行包含 Spark 命令的文件 file spark 有没有办法在没有 sbt 的情况下在 CDH 5 2 中运行 编译 scala 程序 在命令行中 您可以使用 spark sh
  • 如何覆盖 attr_protected?

    我的 STI 实施如下 class Automobile lt ActiveRecord Base end class Car lt Automobile end class Truck lt Automobile end class Us
  • 如何将不同层的核心动画一个接一个地链接起来?

    我有一个启用分页的scrollView和N个页面 它们是作为scrollView的子视图的UIView 我正在尝试执行以下操作 用户滚动到第 n 页 此时 之前添加到第 n 页的 7 个 CALayers 即 到页面 scrollView
  • C# 中加密的数据太长,无法在 Java 中解密

    我有一个用 Java 编写的服务器 它在将其发送到客户端之前将其 RSA 密钥转换为 NET 使用的 XML 格式 public String getPublicKeyXML try KeyFactory factory KeyFactor
  • MERGE 命令导致序列号出现间隙

    我试图利用 MERGE 命令来填充 Snowflake 中的维度 为了实现代理键 我创建了一个默认为序列号的列 每当插入新行时该序列号就会自动递增 我在其他数据仓库平台上尝试了类似的方法 但从未引起任何问题 但是 我注意到 每当我在 Sno
  • 是否可以使用 LINQ 检查列表中的所有数字是否单调递增?

    我感兴趣的是 在 LINQ 中是否有一种方法可以检查列表中的所有数字是否单调递增 Example List
  • 如何在 Vaadin 中禁用浏览器缓存

    我的问题很短 希望很容易解决 我怎样才能完全禁用我的浏览器缓存用vaadin实现的webservice 我想完全禁用缓存 因为当我尝试进行一些 PDF 流式传输并在浏览器中显示它们时遇到问题 我已经阅读了有关我的问题的解决方案 例如这里 使
  • Android 密钥库停止工作

    就在最近 我在密钥存储方面遇到了问题 我知道已经有很多关于这个问题的问题了 我已经阅读了所有这些内容并疯狂地用谷歌搜索 Error keytool error java io IOException Keystore was tampere
  • 将外部 jar 放在 JAVA_HOME/lib/ext 目录中是一件坏事吗?

    我们有一个在 JRE 环境中运行的应用程序 该应用程序使用了一些外部 jar 我们已将它们放在 JAVA HOME lib ext 文件夹中 这对我们来说已经工作了很多年 但最近一位新程序员加入了我们的团队 他似乎强调这是一件多么糟糕的事情
  • `knitr` 可以抑制 sql 块中的执行或输出吗?

    下面的文档运行 sql 并显示结果 我不希望显示任何输出 要么不运行该块 要么隐藏输出 有没有办法做到这一点 output html document Hide SQL Output First set up a temporary dat
  • 如何在 elisp 中将列表作为宏的参数?

    我想实现这样的目标 setq my global keybindings C x C d dired C x C b ibuffer C x b ivy switch buffer apply bind keys my global key
  • 在 IE9 中,如何使用 watir-webdriver 绕过无效证书屏幕?

    这是显示 该网站的安全证书有问题 的屏幕 标头 这是我尝试单击的链接的代码 tr td nbsp td td align left valign middle h4 img src red shield png border 0 alt N
  • Oracle 中的 TO_Char 数字格式模型

    我不完全理解如何使用 to char 函数将数字转换为具有适当格式模型的字符串 实际数字具有以下格式 使用逗号作为小数点分隔符 始终为 5 个小数 整数最多可达 6 可能是无限的 但目前绝不会超过 6 数字可以是正数或负数 数字可以以 0
  • 控制 Prolog 变量值选择

    灵感来自之前的一个问题 https stackoverflow com questions 41595786 using operator to save variables in a list我尝试实现一些可以枚举布尔表达式可能性的东西
  • 在Android上保存文件时避免因中断而丢失数据?

    我想知道其他人在 Android 上保存文件时使用什么策略来避免数据丢失 我有几个游戏应用程序 本质上 它们可能会在用户暂停 onPause 时保存游戏状态 保存游戏 这在 99 99 的情况下有效 但每隔一段时间我就会收到一个保存游戏的例