我不能在构造函数中使用 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()