0

私の主な活動では、いくつかの設定を読みます

  public void onCreate(Bundle savedInstanceState) 
  {
      super.onCreate(savedInstanceState);
      SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(context);
      fontSize = settings.getFloat("textsize", (float) 20);
      userName = settings.getString("userName","");
   }

他のさまざまなサブアクティビティで、これらの変数を次のように参照します

            body.setTextSize(Main.fontSize);

ほとんどの場合、これで問題なく動作します。アプリをしばらく実行した後に再起動すると、すべての構成変数が空のように見えることがあります。デバッグ時に不安定で再現が困難です。それが発生した場合、終了するまですべての古い画面を繰り返しヒットし、再起動すると、設定が戻って機能します

onStart() や onRestart() などの別の場所にランダムに移動してみることができましたが、これまでのところ役に立ちませんでした。または、すべてのアクティビティをやり直して、開始時に共有設定を再読み込みします。しかし、この問題の原因となっている間違ったライフサイクルについて理解したいと思います。

4

1 に答える 1

0

Android はアクティビティを定期的に破棄し、必要に応じて再作成します。したがって、onCreate()関数は保存されたSharedPreferences値を読み取りますが、クラス変数はスコープ内fontSizeuserNameとどまりません。

これらの変数がstatic. あなたの例はfontSize静的な方法でアクセスするので、私はこれを言います:

body.setTextSize(Main.fontSize); 

onPause()おそらくすでに行っているように、値が変更されたときや で値を保存する必要があります。ただし、Android が常にアクティビティを完全に破壊するとは限らないため、それらを読み取るだけでonCreate()は十分ではありません。そのonCreate()ため、Activity が再開するたびに呼び出されるわけではありません。必要なときはいつでも、または で値を再読み込みする必要がありますonResume();

クラスが完全に破棄されない限り、静的変数はJavaによって自動的にクリアされないため、上で「憤慨」と書きました。したがって、値が他の時間よりも長く残り、動作が予測不能に見えることがあります。


最後に、これらの値を静的にすることはベスト プラクティスではありません。SharedPreferences など、アクティビティ間でそれらを共有する方法は他にもたくさんあります。

于 2013-03-20T23:48:58.713 に答える