Попытка сохранить настройки (согласно официальной ссылке на Android) приводит к ошибке - PullRequest
1 голос
/ 21 октября 2011

Мне нужно сохранить некоторые переменные моей основной активности, когда пользователь переходит на другие страницы (действия) моего приложения. Официальная ссылка (http://developer.android.com/reference/android/app/Activity.html#SavingPersistentState) предназначена для сохранения постоянного состояния с использованием следующего кода:

public class CalendarActivity extends Activity {
     ...

     static final int DAY_VIEW_MODE = 0;
     static final int WEEK_VIEW_MODE = 1;

     private SharedPreferences mPrefs;
     private int mCurViewMode;

     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);

         SharedPreferences mPrefs = getSharedPreferences();
         mCurViewMode = mPrefs.getInt("view_mode" DAY_VIEW_MODE);
     }

     protected void onPause() {
         super.onPause();

         SharedPreferences.Editor ed = mPrefs.edit();
         ed.putInt("view_mode", mCurViewMode);
         ed.commit();
     }
 }

Когда я реализовал эту часть кода в своем приложении (небольшая разница вместо ed.putInt я использую ed.putBoolean) и запустил ее, я получил ошибку в LOGCat.

10-21 15: 00: 42.956: ОШИБКА / AndroidRuntime (26590): ИСКЛЮЧИТЕЛЬНОЕ ИСКЛЮЧЕНИЕ: основное 10-21 15: 00: 42.956: ОШИБКА / AndroidRuntime (26590): java.lang.RuntimeException: невозможно приостановить активность {Com.example.android.Pitbul / com.example.android.Soft.Commander}: java.lang.NullPointerException 10-21 15: 00: 42.956: ОШИБКА / AndroidRuntime (26590): в android.app.ActivityThread.performPauseActivity (ActivityThread.java:2731) 10-21 15: 00: 42.956: ОШИБКА / AndroidRuntime (26590): в android.app.ActivityThread.performPauseActivity (ActivityThread.java:2678) 10-21 15: 00: 42.956: ОШИБКА / AndroidRuntime (26590): в android.app.ActivityThread.handleRelaunchActivity (ActivityThread.java:3259) 10-21 15: 00: 42.956: ОШИБКА / AndroidRuntime (26590): в android.app.ActivityThread.access $ 1600 (ActivityThread.java:132) 10-21 15: 00: 42.956: ОШИБКА / AndroidRuntime (26590): в android.app.ActivityThread $ H.handleMessage (ActivityThread.java:1042) ... 10-21 15: 00: 42.956: ОШИБКА / AndroidRuntime (26590): вызвано: java.lang.NullPointerException 10-21 15: 00: 42.956: ОШИБКА / AndroidRuntime (26590): в com.example.android.Soft.Commander.onPause (Commander.java:355) 10-21 15: 00: 42.956: ОШИБКА / AndroidRuntime (26590): в android.app.Activity.performPause (Activity.java:4032) 10-21 15: 00: 42.956: ОШИБКА / AndroidRuntime (26590): в android.app.Instrumentation.callActivityOnPause (Instrumentation.java:1337) 10-21 15: 00: 42.956: ОШИБКА / AndroidRuntime (26590): в android.app.ActivityThread.performPauseActivity (ActivityThread.java:2708) 10-21 15: 00: 42.956: ОШИБКА / AndroidRuntime (26590): ... еще 12

Итак, ошибка происходит на SharedPreferences.Editor ed = mPrefs.edit (); строка.

Почему это случилось? Что мне нужно, чтобы решить эту проблему? Мне действительно нужно сохранить некоторые переменные и прочитать их, когда пользователь вернется на главный экран активности.

1 Ответ

1 голос
/ 21 октября 2011

сделать это следующим образом:

public class CalendarActivity extends Activity {
     ...

     static final int DAY_VIEW_MODE = 0;
     static final int WEEK_VIEW_MODE = 1;

     private SharedPreferences mPrefs;
     private int mCurViewMode;

     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
//other setContentView() etc.
         mPrefs = getSharedPreferences();
         mCurViewMode = mPrefs.getInt("view_mode" DAY_VIEW_MODE);
     }

     protected void onPause() {
         super.onPause();
         SharedPreferences.Editor ed = mPrefs.edit();
         ed.putInt("view_mode", mCurViewMode);
         ed.commit();
     }
 }

Вы ошибаетесь в этой строке:

SharedPreferences mPrefs = getSharedPreferences();

делает ее локальной переменной в onCreate(), поэтому глобальная переменная не может 't инициализируется, что вызывает NullPointerException in onPause()

...