【问题标题】:Android - NullPointerException when SharedPreferences are not initializedAndroid - 未初始化 SharedPreferences 时出现 NullPointerException
【发布时间】:2013-01-21 12:37:47
【问题描述】:

我有一些设置需要在应用程序启动时检索。我首先设计了我的设置页面,保存了设置,然后在主要活动中添加了设置检索代码。该应用程序运行良好。

但如果我清除数据或进行全新安装,则会导致 NullPointerException,我相信这是因为 shared_prefs/settings.xml 根本不存在。

SharedPreferences mSettings;
private String mUsername;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    mSettings = getSharedPreferences("settings", 0);
    mUsername = mSettings.getString("username", null);

    // this results a NullPointerException
    // but it'll be fine the next time app starts with the fix below
    //
    // Toast.makeText(this, mUsername, Toast.LENGTH_LONG);

    // fix: manually initializing prefs
    if(mUsername == null) {
        SharedPreferences.Editor editor = mSettings.edit();
        editor.putString("username", "Android");
        editor.commit();
        mUsername = "Android";
    }
}

修复解决了问题。但是,我还没有看到有人像我一样进行 pref 初始化。

所以我想知道这是否是初始化首选项的正确方法?

【问题讨论】:

标签: android nullpointerexception initialization sharedpreferences


【解决方案1】:

为什么不使用“Android”作为默认值?

mUsername = mSettings.getString("username", "Android");

【讨论】:

  • 用户名“Android”在应用启动时是未知的,它根本不应该出现在活动中。相反,它应该从 SharedPreferences (shared_prefs/settings.xml) 中检索。
  • 当然,在全新安装后,您根本没有偏好,因此所有检索方法都有默认值 - 您有 NPE,因为您返回 null 作为默认值。如果您必须先启动设置活动 - 如果值为空,您可以启动它。这是在应用程序第一次启动时返回一些默认值的常用方法。首选项用于保存应用程序不同启动之间的状态。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多