0

我有一些设置需要在应用程序启动时检索。我首先设计了我的设置页面,保存了设置,然后在主要活动中添加了设置检索代码。该应用程序工作正常。Android - NullPointerException当SharedPreferences未初始化时

但是,如果我清除数据或进行全新安装,它会导致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"; 
    } 
} 

该修复解决了问题。但是,我还没有看到人们按照我的方式进行初始化初始化。

所以我想知道这是否是正确的方式初始化preferecnes?

+0

看看这个[文章] [1] 检查代码的再次尝试。希望这可以帮助。 [1]:http://stackoverflow.com/questions/5734721/android-shared-preferences – jzafrilla

回答

0

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

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

用户名“机器人”是在应用程序启动未知的,它不应该出现在活动的。相反,它应该从SharedPreferences(shared_prefs/settings.xml)中检索。 – user1643156

+0

当然,在全新安装之后,根本没有首选项,并且因为所有的回收方法都具有默认值 - 您拥有NPE是因为您将null作为默认值返回。如果您必须首先启动设置活动 - 如果值为空,则可以启动它。这是在应用第一次启动时返回一些默认值的常用方法。首选项用于在应用程序的不同开始之间保存状态。 – dilix