我一直在研究在转弯之间保存游戏数据的替代方法,并想知道是否有人能指出我正确的方向。
我有大约32k的数据,必须在onPause期间保存。由于数据量巨大,我排除了偏好。我花了几天时间玩SQLite,但无法在不到两秒的时间内保存数据(尽管时间肯定没有浪费)。
我已决定在游戏开始时使用数据库加载常量数据。这肯定会更容易调整游戏中的各种参数和默认值。但这仍然让我寻找理想的数据写入方法。
需要保存的数据基本上是9次出现A类,9次出现在B类。我是Android学习曲线的密集月份(以及来自C ++背景的Java的细微差别)和一直在谷歌上搜索疯狂。这带来了两种可能性 -
1)序列化(ObjectOutputStream)
我认为这将是一个完美的解决方案,但是,在阅读了有关该主题的其他几篇文章之后,由于速度和内存分配导致垃圾收集器陷入潜在的愤怒,因此在Android平台上强烈推荐它。 / p>
2)DataOutputStream类
我目前的想法是向两个类添加加载和保存函数,并使用其中的DataOutputStream和DataInputStream调用来分别写入和读取数据。
类中的数据是基元(主要是字符串和整数)和基元数组,所以没有什么太复杂可以分解。这第二个解决方案看起来是一个好的,可行的吗?或者还有其他我不知道的解决方案吗?
答案 0 :(得分:2)
为什么数据库写入有2秒的限制?如果纯粹是出于UI响应的原因,那么您可以采取另一种方法。
您实际上不必在onPause
方法本身中执行保存,您可以启动实际为您执行保存的新Thread
。
private void backgroundSave(){
Thread backgroundThread = new Thread() {
@Override
public void run() {
//do save here
}
};
backgroundThread.start();
}
@Override
protected void onPause() {
super.onPause();
backgroundSave();
}
您也可以使用AsyncTask
。
当用户在保存完成之前尝试重新启动您的应用时,您可能需要考虑这种情况,但这不应该太难以考虑。
答案 1 :(得分:2)
您应该使用Async任务来保存数据,我使用此方法在游戏开始时获取高分:
new HighscoreTask().execute(this);
Async任务如下所示:
public class HighscoreTask extends AsyncTask<MainView, Void, Void> {
protected void onPreExecute() {
}
protected void onPostExecute(final Void unused) {
}
@Override
protected Void doInBackground(MainView... params) {
HighScoreFactory.syncScores();
return null;
}
}
所有数据库交互都发生在 HighScoreFactory.syncScores()中,这可能需要多长时间,因为它发生在后台。在我的例子中,它向外部服务器发送HTTP请求并将它们加载到数据库中。它从来没有引起任何问题,无缝地工作。
答案 2 :(得分:1)
您是否尝试过在交易中将数据插入数据库?
try{
db.beginTransaction();
//here insert data to database
db.setTransactionSuccessful();
} finally {
db.endTranscation();
}
这可以加快操作。
答案 3 :(得分:0)
使用Context.openFileOutput(String name,int mode)创建一个新的Thread来执行数据写入,并将其作为上下文。然后,您可以使用新线程在后台编写它并使用以下内容检索它:Context.openFileInput(String name),并将其作为上下文。希望这会有所帮助。