我可以不在构造函数中使用SharedPreference吗?

时间:2016-04-21 18:40:34

标签: android android-sharedpreferences

我使用一个简单的类来执行某些操作(计算),并希望在以后可能使用的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)'在空对象引用上

2 个答案:

答案 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();
        }
    }

所以在你的情况下 - 当你开始活动时,使用JSONStringintent.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);