次のようなコードを使用して、ゲームの進行状況をユーザーに保存しようとするゲームアプリがいくつか市場に出回っています(簡略化):
public class Globals extends Application
{
public void onCreate()
{
settings = getSharedPreferences("MyPrefsFile", 0);
}
public void get_state()
{
synchronized (this)
{
game_progress = settings.getInt("progress", 1);
}
}
public void save_state()
{
synchronized (this)
{
SharedPreferences.Editor editor = settings.edit();
editor.putInt("progress",game_progress);
editor.commit();
}
}
}
これは 99% の確率で問題なく動作しているように見えますが、進行状況が失われたというユーザーからの報告がときどきありますが、バグを繰り返すことができる一連のアクションを誰も教えてくれませんでした.. 。 今まで。この手順では、「ホーム」ボタンを押してプログラムを終了し、数時間待機します。その後、ゲームを再度実行すると、進行状況が失われます。イライラすることに、このシーケンスを短縮することはできません。電話を数時間放置する代わりに「強制停止」を行っても、同じ効果はありません。
おそらく、電話を数時間放置すると、アプリケーション内のアクティビティの一部またはすべてが、強制停止とは微妙に異なる方法でシャットダウンされる可能性があります...しかし、私にはその方法がわかりません.
何か案は?
編集:ゲームを構成するさまざまなアクティビティからこれらの関数がどのように呼び出されるかを説明する必要があります。以下に例を示しますが、他のいくつかの場所からも gs.save_state() を呼び出します。
public class Main_GamePlay extends Activity
{
Globals gs;
public void onCreate(Bundle savedInstanceState)
{
gs = ((Globals) getApplicationContext());
}
protected void onPause()
{
gs.save_state();
}
}