java - SharedPreferences 在检索值时返回 null

标签 java android sharedpreferences

我试图在应用程序关闭或被销毁时使用 SharedPreferences 将一些值保存为键值对,并在应用程序再次打开时检索它们。 问题是当我调用检索值时,它返回 null

我试过传递上下文或获取应用程序上下文并使值静态,但它似乎不起作用。

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"));
}}
}

我正尝试在我的主要 Activity 的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"));
        }}
}

希望对你有所帮助。

关于java - SharedPreferences 在检索值时返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54687920/

相关文章:

java - 使用 FileInputStream 而不是 FileReader 时实际会发生什么?

java - 从 IntentService 调度递归处理程序以重试 http 调用

java - java中原始类型char的值指的是哪个Unicode表?

java - 如何停止java中所有正在运行的计时器?

java - 如何在 Android 中使用另一个类中的变量?

android - 手机传感器

android - SharedPreferences:应用程序崩溃时如何清除所有首选项

android - 为我的自定义 DialogPreference 设置主题?

android - 可以混淆/加密 SharedPreferences 文件吗?

android - 我可以从服务内的共享首选项中获取数据吗?