0

次のようなコードを使用して、ゲームの進行状況をユーザーに保存しようとするゲームアプリがいくつか市場に出回っています(簡略化):

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();
        }
    }
4

1 に答える 1

0

あなたのケースで起こっているのはメモリの再利用であるため、適切なシーケンスがあるべきではないかもしれません.ホームを押すと、アプリはバックグラウンド状態になり、ガベージコレクターによる再利用の優先度が高くなります.したがって、現在の保存を試みる必要があります共有設定以外の方法で状態を保存します。可能であれば、現在のアクティビティのホーム プレスで状態を保存する必要があります。

これがあなたが望むものについての簡単なアイデアを与えることを願っています.

于 2013-01-17T12:53:16.787 に答える