java - SharedPreferences 在检索值时返回 null
问题描述
我试图SharedPreferences
在应用程序关闭或被销毁时将一些值保存为键值对,并在再次打开应用程序时检索它们。问题是当我调用检索值时,它返回null
.
我尝试过传递上下文或获取应用程序上下文并设置值static
,但它似乎不起作用。
class SavedValues {
private static final String keyP1fName = String.valueOf(R.string.player_1_name_key);
private static final String keyP1Game = String.valueOf(R.string.player_1_game_key);
private static final String keyP2fName = String.valueOf(R.string.player_2_sname_key);
//Have other strings here
private MainGame mainGame;
SavedValues(MainGame mainGame) {
this.mainGame = mainGame;
}
//private SharedPreferences mPrefs = mainGame.getSharedPreferences("myPrefs", Context.MODE_PRIVATE);
private SharedPreferences mPrefs = mainGame.getPreferences(Context.MODE_PRIVATE);
//SharedPreferences mPrefs = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
void saveMainGameValues() {
SharedPreferences.Editor editor = mPrefs.edit();
editor.putString(keyP1fName, mainGame.fullNameP1.getText().toString());
editor.putString(keyP1Game, mainGame.gameScoreP1.getText().toString());
editor.putString(keyP2fName, mainGame.fullNameP2.getText().toString());
editor.putString(keyP2Game, maingGame.gameScoreP2.getText().toString());
editor.apply();
}
void getMainGameValues() {
mPrefs = mainGame.getPreferences(Context.MODE_PRIVATE);
if (mPrefs.contains(keyP1fName)) {
mainGame.fullNameP1.setText(mPrefs.getString(keyP1fName, "Player 1"));
mainGame.gameScoreP1.setText(mPrefs.getString(keyP1Game, "0"));
mainGame.fullNameP2.setText(mPrefs.getString(keyP2fName, "Player 2"));
mainGame.gameScoreP2.setText(mPrefs.getString(keyP2Game, "0"));
}}
}
我试图在我的主要活动的onStart/onStop等方法中调用这些
@Override
protected void onStart() {
//savedVals.getMainGameValues();
super.onStart();
}
@Override
protected void onResume() {
savedVals.getMainGameValues();
super.onResume();
}
@Override
protected void onPause() {
super.onPause();
savedVals.saveMainGameValues();
}
@Override
protected void onStop() {
super.onStop();
savedVals.saveMainGameValues();
}
@Override
protected void onDestroy() {
super.onDestroy();
savedVals.saveMainGameValues();
}
我应该获取最后检索到的值或至少是默认值,但应用程序崩溃并在 onStart 或 onResume 中的回调出现以下错误:
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void com.andygix.a40love.SavedValues.getMainGameValues()' on a null object reference
at com.andygix.a40love.MainGame.onResume(MainGame.java:379)
at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1364)
at android.app.Activity.performResume(Activity.java:7490)
解决方案
你SavedValues
上课有逻辑错误。
当您的类将被初始化时,将调用构造函数并mainGame
获取一些值,但在此之前您将创建mPref
变量,因此它没有任何值。您必须mPref
在构造函数中初始化。
在这里,我更新了课程..尝试替换并检查。
class SavedValues {
private static final String keyP1fName = String.valueOf(R.string.player_1_name_key);
private static final String keyP1Game = String.valueOf(R.string.player_1_game_key);
private static final String keyP2fName = String.valueOf(R.string.player_2_sname_key);
private MainGame mainGame;
/**************************** THIS PART I CHANGED *******************/
private SharedPreferences mPrefs;
SavedValues(MainGame mainGame) {
this.mainGame = mainGame;
mPref = mainGame.getPreferences(Context.MODE_PRIVATE);
}
/**********************************************/
//private SharedPreferences mPrefs = mainGame.getSharedPreferences("myPrefs", Context.MODE_PRIVATE);
//SharedPreferences mPrefs = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
void saveMainGameValues() {
SharedPreferences.Editor editor = mPrefs.edit();
editor.putString(keyP1fName, mainGame.fullNameP1.getText().toString());
editor.putString(keyP1Game, mainGame.gameScoreP1.getText().toString());
editor.putString(keyP2fName, mainGame.fullNameP2.getText().toString());
editor.putString(keyP2Game, maingGame.gameScoreP2.getText().toString());
editor.apply();
}
void getMainGameValues() {
mPrefs = mainGame.getPreferences(Context.MODE_PRIVATE);
if (mPrefs.contains(keyP1fName)) {
mainGame.fullNameP1.setText(mPrefs.getString(keyP1fName, "Player 1"));
mainGame.gameScoreP1.setText(mPrefs.getString(keyP1Game, "0"));
mainGame.fullNameP2.setText(mPrefs.getString(keyP2fName, "Player 2"));
mainGame.gameScoreP2.setText(mPrefs.getString(keyP2Game, "0"));
}}
}
希望它会帮助你。
推荐阅读
- python - Unicode 错误使用 to_csv 尽管指定编码 = 'utf-8'
- c - 如果在带有 tmpfs 的容器中运行,为什么介子无法确定 time_t 的大小?
- wordpress - 使用插件的分类模板
- javascript - Moment.js 在两个日期之间没有像我预期的那样工作
- python - Python - 使用正则表达式从文本数据中删除变量
- abap - 在 ALV-grid 的一个单元格中显示多行
- android - 使用 API 28 和“androidx.appcompat”库项目显示“AppCompatActivity”符号未找到
- javascript - 每个测试文件之前的 Jest 异步设置
- android - 科尔多瓦编辑配置不更新 AndroidManifest.xml
- java - 为什么 java "putAll" 不能深度复制 Map 的值元素?