当我启动我的应用程序并且正在运行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!"));
}
答案 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
。