1

当用户跳转到我的应用程序的另一个页面(活动)时,我需要保存我的主要活动的一些变量。官方参考 (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: ERROR/AndroidRuntime(26590): FATAL EXCEPTION: main 10-21 15:00:42.956: ERROR/AndroidRuntime(26590): java.lang.RuntimeException: Unable to pause activity {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: ERROR/AndroidRuntime(26590): Caused by: java.lang.NullPointerException 10-21 15:00 :42.956: ERROR/AndroidRuntime(26590): at com.example.android.Soft.Commander.onPause(Commander.java:355) 10-21 15:00:42.956: ERROR/AndroidRuntime(26590): at 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: ERROR/AndroidRuntime(26590): at android.app.ActivityThread.performPauseActivity(ActivityThread.java:2708) 10-21 15:00:42.956: ERROR/AndroidRuntime(26590): ... 12 更多错误/AndroidRuntime(26590): 由: java.lang.NullPointerException 10-21 15:00:42.956: 错误/AndroidRuntime(26590): at 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 更多错误/AndroidRuntime(26590): 由: java.lang.NullPointerException 10-21 15:00:42.956: 错误/AndroidRuntime(26590): at 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 更多错误/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 更多错误/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(); 细绳。

为什么会这样?我需要什么来解决这个问题?我真的需要保存一些变量并在用户返回主活动屏幕时读取它们。

4

1 回答 1

1

这样做:

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

使其成为局部变量 in onCreate(),因此无法初始化全局变量,从而导致NullPointerExceptioninonPause()

于 2011-10-21T12:58:19.967 回答