在Android中,空对象引用上的共享首选项

20

我是新手安卓开发者,也许这是一个愚蠢的问题,但请帮助我。在尝试保存int值时,我遇到了以下错误。

Caused by: java.lang.NullPointerException: 尝试在空对象引用上调用虚拟方法'android.content.SharedPreferences android.content.Context.getSharedPreferences(java.lang.String,int)'

这是我的代码:

SharedPreferences prefs = this.getSharedPreferences("com.example.app", Context.MODE_PRIVATE);
String value = "com.example.app.value";
int i = prefs.getInt(value, 0);

并写入

prefs.edit().putInt(number, i).apply();

我只想设置SharedPreferences,并在Activity中读取它并将其写入。我该如何解决?

编辑

public class MainActivity extends Activity {
SharedPreferences sharedpreferences;
public static final String MyPREFERENCES = "myprefs";
public static final  String value = "key";

int i = sharedpreferences.getInt(value, 0);

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    sharedpreferences = getSharedPreferences(MyPREFERENCES, Context.MODE_PRIVATE);
}
public void sendMessage(View view) {
    i += 1;    
    SharedPreferences.Editor editor = sharedpreferences.edit();
    editor.putInt(value, i);
    editor.apply();
}

我成功地用另一种方式保存了偏好设置,但我无法在MainActivity扩展的Activity类中读取它。

日志:

Caused by: java.lang.NullPointerException: 尝试在空对象引用上调用接口方法'int android.content.SharedPreferences.getInt(java.lang.String, int)'


2
SharedPreferences prefs = yourActivity.this.getSharedPreferences("com.example.app", Context.MODE_PRIVATE); - M D
^ 相对于直接调用getSharedPreferences(),yourActivity.this.getSharedPreferences()没有任何影响,因为提供的代码已经在activity中;只有在实用程序类中才会这样做(在这种情况下,直接调用getSharedPreferences()甚至无法编译)。此外,硬编码包名称是不好的实践(这是一个魔术字符串),应该调用getPackageName()。 - OldSchool4664
4个回答

19

这是SharedPreferences的一个示例:

要将name保存在SharedPreferences中:

SharedPreferences sharedPreferences = PreferenceManager
                .getDefaultSharedPreferences(this);
        Editor editor = sharedPreferences.edit();
        editor.putString(key, name);
        editor.apply();
从SharedPreferences获取name的方法:
 SharedPreferences sharedPreferences = PreferenceManager
                .getDefaultSharedPreferences(this);
        String name = sharedPreferences.getString(key, "default value");

了解更多详情请访问:http://developer.android.com/training/basics/data-storage/shared-preferences.html

更新的代码:

public class MainActivity extends Activity {
SharedPreferences sharedpreferences;
public static final String MyPREFERENCES = "myprefs";
public static final  String value = "key";

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    sharedpreferences = getSharedPreferences(MyPREFERENCES, Context.MODE_PRIVATE);
    int i = sharedpreferences.getInt(value, 0);
    //use the value of i where needed.
}
public void saveMessage(View view) {
    i += 1;    
    SharedPreferences.Editor editor = sharedpreferences.edit();
    editor.putInt(value, i);
    editor.apply();
}

请使用 .apply() 代替 commit()。 - Douglas Fornaro
2
由于:java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法'java.lang.String android.content.Context.getPackageName()',现在出现了此错误。 - Simbilli Dev
@SimbilliDev请在您的问题帖子中发布活动的完整代码。我将对其进行更正。 - Anand Singh
谢谢帮忙。我找到了另一种解决方法,但这个也起作用了。 - Simbilli Dev
是的,有很多方法可以使用SharedPreferences。您可以在我的回答中提到的链接中了解更多详细信息。 - Anand Singh

4

2

你可以这样实现它

public class PreferenceClass {
    public static final String PREFERENCE_NAME = "PREFERENCE_DATA";
    private final SharedPreferences sharedpreferences;

    public PreferenceClass(Context context) {
         sharedpreferences = context.getSharedPreferences(PREFERENCE_NAME, Context.MODE_PRIVATE);
    }

    public int getCount() {
         int count = sharedpreferences.getInt("count", -1);
         return count;
    }

    public void setCount(int count) {
         SharedPreferences.Editor editor = sharedpreferences.edit();
         editor.putInt("count", count);
         editor.commit();
    }

    public void clearCount() {
         SharedPreferences.Editor editor = sharedpreferences.edit();
         editor.remove("count");
         editor.commit();
    }
}

如果没有设置任何值,getCount() 将返回 -1。


2

这个问题是关于“用RetroFit简化网络”安卓课程的。我之前没有在Android清单文件中添加BaseApplication类,所以导致了这个错误……现在一切都好了。


这个错误困扰我两天了。在阅读了你的回答之后,我才注意到我没有在清单文件中放置我的基础应用程序类。现在运行良好。 - deluxan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接