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 会定期销毁您的 Activity 并在需要时重新创建它。因此,您的onCreate()函数正在读取保存的SharedPreferences值,但类变量fontSizeuserName没有停留在范围内。

我相信这个问题似乎是随机的,而且很恼火,因为这些变量似乎是static. 我这样说是因为您的示例fontSize以静态方式访问:

body.setTextSize(Main.fontSize); 

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

我在上面写了“激怒”,因为静态变量不会被 Java 自动清除,除非类被完全销毁。因此,有时这些值会比其他时间停留更长时间,从而使行为看起来不可预测。


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

于 2013-03-20T23:48:58.713 回答