对于Android的游戏应用程序,我通过将其写入文件来保存播放器的信息。但是,在实际文件写入期间可以强制终止应用程序,结果是下次用户玩游戏时,由于正在写入的保存文件为空,所以他的所有信息都会丢失。有没有办法解决?以下是我将文件写入存储的方法:
String data = "SAVEDATA";
try {
FileOutputStream outputStream;
File file = new File("file.txt");
outputStream = new FileOutputStream(file, false);
outputStream.write(data.getBytes());
outputStream.close();
} catch (Exception e) {
e.printStackTrace();
}
如果用户在写入文件时结束进程,则没有任何内容写入文件,所有以前的保存数据都会丢失(因为每次保存都会覆盖文件)。避免这种情况的最佳方法是什么?
编辑:我不是在寻找另一种方法来保存我的数据,我当然希望将其保存为手机存储上保存的文件。我只是想知道当用户在写入保存文件时结束应用程序的进程时如何防止数据丢失。EDIT2:每当需要保存游戏数据时启动服务是个好主意,这样即使应用程序被终止,服务仍然在保存数据的同时,服务也可以自行结束保存完成后?
答案 0 :(得分:0)
如果要保存字符串或原始值,则应使用共享首选项,这是一个解释其用法的链接: http://developer.android.com/guide/topics/data/data-storage.html#pref
答案 1 :(得分:0)
首先,避免覆盖旧的保存。将您的保存命名为: save_1 , save_2 , save_3 ,... save_n 并删除旧保存不再需要了。
另一个好主意是在用户完成游戏中的某些操作后立即自动保存。这最大限度地减少了用户在易失性存储器中保存进度的时间。
如果您的游戏代码在活动中运行,您也可以保存在onPause方法中。
如果您的游戏代码在后台服务中运行,并且用户从Android的“设置”菜单(或使用进程杀手)手动结束您的进程,则将调用您的服务的onDestroy方法,因此您可以保存该方法。
编辑:如果您遇到的问题是您的用户从“应用程序无响应”对话框关闭您的应用程序,则根本原因可能是您正在保存在UI线程上。尝试启动AsyncTask或IntentService来进行保存。
答案 2 :(得分:0)
您可以使用Android的AtomicFile,确保通过创建备份文件以原子方式写入文件。 https://developer.android.com/reference/android/support/v4/util/AtomicFile.html
示例:
String data = "SAVEDATA";
File file = new File("file.txt");
AtomicFile atomicFile = new AtomicFile(file);
FileOutputStream fos = null;
try {
fos = atomicFile.startWrite();
fos.write(data.getBytes());
atomicFile.finishWrite(fos);
}catch(IOException e){
atomicFile.failWrite(fos);
throw e;
}
答案 3 :(得分:-1)
将数据保存在onPause
中是可行的方法;进一步阅读以下data storage
进一步阅读here以进行基本数据存储
希望它有所帮助:)