我不能在构造函数中使用 SharedPreference 吗?
Can I not use SharedPreference inside a constructor?
我正在使用一个简单的 class 来执行一些操作(计算),并想在 SharedPreferences 中写入一个值,以后可能会用到。
但是,这不起作用。我从 Activity 扩展了 class 以便我可以使用 getSharedPReferences()
方法。这是否不正确且不允许?
我在尝试初始化共享首选项编辑器时遇到空指针异常
代码如下:
public class JSONParser extends Activity {
// To store our preferences for JSON route info
public static final String MY_PREFS_JSON = "JSONPrefs";
// Construct an object with JSON values
public JSONParser(String JSONString){
try {
JSONObject jsonObject = new JSONObject(JSONString);
JSONArray routesArray = jsonObject.getJSONArray("routes");
// fails with NullPointer
SharedPreferences.Editor editor = getSharedPreferences(MY_PREFS_JSON, MODE_PRIVATE).edit();
// Store in SharedPreferences our JSON value
editor.putString("JSON", routesArray.toString());
editor.commit();
}
}
}
添加错误信息:
java.lang.NullPointerException: 尝试在空对象引用
上调用虚拟方法'android.content.SharedPreferences android.content.Context.getSharedPreferences(java.lang.String, int)'
Activity 不能有备用构造函数(或者更恰当地说,它们不应该有)。活动必须只有一个默认的空构造函数。
此外,您无法在 Activity 的构造函数中获取系统服务。其中 None 个已创建,因此它们都将 return 为空。
您必须等到 Activity#onCreate()
才能检索 SharedPreferences。
public class JSONParser extends Activity {
public static final String PARAM_JSON = "json";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
String json = getIntent().getStringExtra(PARAM_JSON);
if (json == null || json.trim().isEmpty() {
finish();
return;
}
// do stuff with json.
}
}
然后以这样的意图启动它:
Intent intent = new Intent(context, JSONParser.class);
intent.putExtra(JSONParser.PARAM_JSON, jsonString);
activity 上下文在 onCreate()
被调用之前不会被创建。所以,如果你想做一些涉及 context
的事情,那么在 onCreate()
.
中做
@Override
protected void onCreate(Bundle savedInstanceState) {
try {
JSONObject jsonObject = new JSONObject(JSONString);
JSONArray routesArray = jsonObject.getJSONArray("routes");
// fails with NullPointer
SharedPreferences.Editor editor = getSharedPreferences(MY_PREFS_JSON, MODE_PRIVATE).edit();
// Store in SharedPreferences our JSON value
editor.putString("JSON", routesArray.toString());
editor.commit();
}
}
所以在你的情况下 - 在你开始 activity 时使用 intent.putExtra()
将 JSONString
传递给你的 activity 并使用 onCreate()
获取它getIntent().getStringExtra()
我正在使用一个简单的 class 来执行一些操作(计算),并想在 SharedPreferences 中写入一个值,以后可能会用到。
但是,这不起作用。我从 Activity 扩展了 class 以便我可以使用 getSharedPReferences()
方法。这是否不正确且不允许?
我在尝试初始化共享首选项编辑器时遇到空指针异常
代码如下:
public class JSONParser extends Activity {
// To store our preferences for JSON route info
public static final String MY_PREFS_JSON = "JSONPrefs";
// Construct an object with JSON values
public JSONParser(String JSONString){
try {
JSONObject jsonObject = new JSONObject(JSONString);
JSONArray routesArray = jsonObject.getJSONArray("routes");
// fails with NullPointer
SharedPreferences.Editor editor = getSharedPreferences(MY_PREFS_JSON, MODE_PRIVATE).edit();
// Store in SharedPreferences our JSON value
editor.putString("JSON", routesArray.toString());
editor.commit();
}
}
}
添加错误信息:
java.lang.NullPointerException: 尝试在空对象引用
上调用虚拟方法'android.content.SharedPreferences android.content.Context.getSharedPreferences(java.lang.String, int)'Activity 不能有备用构造函数(或者更恰当地说,它们不应该有)。活动必须只有一个默认的空构造函数。
此外,您无法在 Activity 的构造函数中获取系统服务。其中 None 个已创建,因此它们都将 return 为空。
您必须等到 Activity#onCreate()
才能检索 SharedPreferences。
public class JSONParser extends Activity {
public static final String PARAM_JSON = "json";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
String json = getIntent().getStringExtra(PARAM_JSON);
if (json == null || json.trim().isEmpty() {
finish();
return;
}
// do stuff with json.
}
}
然后以这样的意图启动它:
Intent intent = new Intent(context, JSONParser.class);
intent.putExtra(JSONParser.PARAM_JSON, jsonString);
activity 上下文在 onCreate()
被调用之前不会被创建。所以,如果你想做一些涉及 context
的事情,那么在 onCreate()
.
@Override
protected void onCreate(Bundle savedInstanceState) {
try {
JSONObject jsonObject = new JSONObject(JSONString);
JSONArray routesArray = jsonObject.getJSONArray("routes");
// fails with NullPointer
SharedPreferences.Editor editor = getSharedPreferences(MY_PREFS_JSON, MODE_PRIVATE).edit();
// Store in SharedPreferences our JSON value
editor.putString("JSON", routesArray.toString());
editor.commit();
}
}
所以在你的情况下 - 在你开始 activity 时使用 intent.putExtra()
将 JSONString
传递给你的 activity 并使用 onCreate()
获取它getIntent().getStringExtra()