从SharedPreferences读取时的奇怪行为

时间:2013-11-22 22:54:50

标签: java android sharedpreferences

当我启动我的应用程序并且正在运行onResume()方法时,从我的SharedPreferences读取时出现问题。这就是代码的外观。

static double cowCount = 197, income, cowMult = 1;
...
protected void onResume() { 
    super.onResume();
    SharedPreferences sharedPref = getSharedPreferences("com.example.cowcount", Context.MODE_PRIVATE);
    cowCount = sharedPref.getFloat("cowCount", 0);
    cowMult = sharedPref.getFloat("cowMult", 0);
    income = sharedPref.getFloat("income", 0);

 }
...

当代码是这样时,应用程序正在被冻结。该应用程序由一个计数器组成,当我按下应该计数的按钮时,没有任何反应。

但是,当我注释掉我从SharedPreferences为cowMult双赋值的行时,应用程序不会冻结。

cowCount = sharedPref.getFloat("cowCount", 0);
// cowMult = sharedPref.getFloat("cowMult", 0);
income = sharedPref.getFloat("income", 0);

要明确的是,上述工作正常。

这是按下按钮时调用的方法(假设将cowCount的值提高一个):

public void addCow (View view) {
    cowCount = cowCount + cowMult;
    refresh();
}
...
public void refresh () {
TextView myTextView = (TextView)findViewById(R.id.myText);
myTextView.setText("You Have " + String.valueOf((nf.format(cowCount)) + " Cows!"));
}

2 个答案:

答案 0 :(得分:0)

您发布的代码有几件事情很奇怪

1你为什么打电话

SharedPreferences sharedPref = getSharedPreferences(null, Context.MODE_PRIVATE);

而不是

SharedPreferences sharedPref = getSharedPreferences( "com.myname.myapp", Context.MODE_PRIVATE);

2你的onResume应该是以下

super.onResume();
SharedPreferences sharedPref = getSharedPreferences(null, Context.MODE_PRIVATE);
cowCount = Double.longBitsToDouble(sharedPref.getLong("cowCount", 0));
cowMult = Double.longBitsToDouble(sharedPref.getLong("cowMult", 0));
income = Double.longBitsToDouble(sharedPref.getLong("income", 0));

首先在代码之前调用super.onResume()(与所有生命周期方法相同)

EDIT 3.为什么你不只是将你的值设置为一个int(从你上面所说的那个)或者一个浮点数,它可能会给你所有的精度,然后你可以使用

获得你的值
getInt(String key, int defValue)

getFloat(String key, float defValue)

借调编辑 你可以在代码中看到一些奇怪的方法。尝试下面的代码,让我知道它是否解决了问题(虽然我看不出sharedPreferences将如何导致它)。我假设从onClickListener

调用addCow方法
//get a reference for your myTextView in the onCreate() method, after declaring your variable

//outside the onCreate method i.e
TextView myTextView;
...
// int onCreate()
 myTextView = (TextView)findViewById(R.id.myText);

//you don't need to pass a view parameter, so don't
public void addCow () {
    cowCount = cowCount + cowMult;
    refresh();
}
...
public void refresh () {
  //the way you are getting a string value is also not what I would do either use
  //Float.toString(cowCount) or just
   myTextView.setText("You Have " + cowCount + " Cows!"));
}

希望问题消失。

答案 1 :(得分:0)

按如下方式更改您的代码:

static float cowCount, income, cowMult;
...
protected void onResume()
{
    super.onResume();
    SharedPreferences sharedPref = getSharedPreferences("com.example.cowcount", Context.MODE_PRIVATE);
    cowCount = sharedPref.getFloat("cowCount", 197);
    cowMult = sharedPref.getFloat("cowMult", 1);
    income = sharedPref.getFloat("income", 0);
}
...

SharedPreferences.getFloat()中的第二个参数是默认值,如果找不到该键,该方法将返回该值。使用您提供的代码,如果您没有正确地将值保存到SharedPreferences,那么这些变量将被赋值为0.这就是按下按钮时没有任何变化的原因;您正在添加0.检查以确保正确保存到SharedPreferences

此外,在声明变量时初始化变量没有意义,因为它们都在onResume方法中被赋值,无论是保存值还是默认值。

正如Martin指出的那样,在TextView方法中指定onCreate