2016-04-21 2 views
-1

Я использую простой класс для выполнения некоторых действий (вычислений) и хочу записать значение в SharedPreferences, которое впоследствии может быть использовано.Могу ли я использовать SharedPreference внутри конструктора?

Однако, это не работает. Я расширил класс из Activity, чтобы использовать метод getSharedPReferences(). Это неправильно и не разрешено?

Я получаю исключения нулевого указателя пытается инициализируем редактор sharedpreference

код ниже:

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: Попытка вызова виртуальной method 'android.content.SharedPreferences android.content.Context.getSharedPreferences (java.lang.String, int)' на ссылке нулевого объекта

+0

то, что вы получаете ошибку? – FredMaggiowski

ответ

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()

+0

Обновлен ответ о том, как передать JSONString в вашу деятельность. –

+0

Нет, это не решает мою проблему. Этот класс представляет собой «нормальный» класс, созданный в Activity, только для использования SharedpReferences. Фактически объект этого типа класса создается другим классом, который снова не является активностью. Возможно, есть альтернативный способ добиться того, что я делаю, т. Е. Сохранить что-то, что может быть доступно в какой-либо другой деятельности в другое время. – zooter

+1

Если это так, передайте контекст приложения с помощью 'getApplicationContext()' полностью из launcher к классу, в котором вы хотите использовать prefs, и использовать этот контекст для сохранения ваших привилегий в любом методе вашего класса (активности или неактивности). –

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); 
+0

Итак, каково решение написать какое-то значение в SharedPreference через обычный класс? Или, альтернативно, я хочу сохранить конкретное строковое значение (значение JSON), которое может быть использовано в будущем в другом месте в другом действии. – zooter