【问题标题】:preferences getting lost after app has run for awhile应用程序运行一段时间后首选项丢失
【发布时间】:2013-03-20 23:01:41
【问题描述】:

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

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

【问题讨论】:

  • “我可以随机尝试将东西移动到不同的地方”。它没有随机性。如文档所述,Android 正在破坏您的活动。在 onPause() 中保存首选项,在 onResume() 中重新加载它们。

标签: android preferences lifecycle


【解决方案1】:

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

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

body.setTextSize(Main.fontSize); 

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

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


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

【讨论】:

  • 谢谢,这是有道理的。我想我只会更改子活动以重新加载共享首选项。这似乎是一个很大的开销,因为它主要是这样工作的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-04-05
  • 2019-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-17
  • 2018-04-30
相关资源
最近更新 更多