应用程序运行一段时间后,首选项会丢失

时间:2013-03-20 23:01:42

标签: android preferences lifecycle

在我的主要活动中,我阅读了一些偏好

  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(),到目前为止还没有帮助。或者重做每个活动以在启动时重新读取共享首选项。但是我更愿意理解导致这个问题的生命周期是什么。

1 个答案:

答案 0 :(得分:0)

Android会定期销毁您的Activity并在需要时重新创建它。 因此,您的onCreate()函数正在读取已保存的SharedPreferences值,但类变量fontSizeuserName并未停留在范围内。

我认为问题似乎是随机,并且因为这些变量似乎是static而感到恼怒。我之所以这样说,是因为您的示例以静态方式访问fontSize

body.setTextSize(Main.fontSize); 

您应该在更改时保存值,或者在onPause()中保存,就像您可能已经这样做的那样。但是,仅在onCreate()中阅读它们是不够的,因为Android并不总是会完全破坏您的活动。因此,每次您的活动恢复时都不会调用onCreate()。您必须在需要时或onResume();中重新读取值。

我在上面写了'exasperated',因为除非类完全被破坏,否则Java不会自动清除静态变量。因此,有时值会比其他时间更长时间保持不变,使行为看起来不可预测。


最后,允许这些值是静态的不是最佳实践。还有很多其他方法可以在Activites之间共享它们,包括SharedPreferences。

相关问题