我使用一个简单的类来执行某些操作(计算),并希望在以后可能使用的SharedPreferences中写入一个值。
但是,这不起作用。我从Activity扩展了类,以便我可以使用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)'在空对象引用上
答案 0 :(得分:3)
在调用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();
}
}
所以在你的情况下 - 当你开始活动时,使用JSONString
将intent.putExtra()
传递给你的活动,然后使用onCreate()
getIntent().getStringExtra()
中获取它
答案 1 :(得分:2)
活动不能有替代构造函数(或者更合适的是它们不应该)。活动必须只有一个默认的空构造函数。
此外,您无法在Activity的构造函数中获取系统服务。它们都还没有被创建,因此它们都将返回null。
您必须等到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);