getSharedPreferences在某些设备上出现空指针异常

时间:2014-11-12 18:30:17

标签: java android sharedpreferences

我正在使用SharedPreferences获取一些保存的值。我只在某些设备上获得空指针异常。当我在自己的设备中测试代码时,我没有遇到任何问题。但是我的一些用户得到了错误。

这是获取SharedPreference值的类:

public class SavingData {
     public static final String PREFS_NAME = "MyPrefsFile";
     public static MainActivity mainActivity;

public static int getRestTime() {
    // Restore preferences
    SharedPreferences settings = mainActivity.getSharedPreferences(PREFS_NAME, 0);
    int restTime = settings.getInt("resttime", defaultRestTime); // 0 is the default
                                                        // value
    return restTime;
}

在我的主类中,我声明了mainActivity变量。

  SavingData.mainActivity = this;

这是我得到的错误:

  

java.lang.RuntimeException:无法启动活动
  ComponentInfo {com.playsimple.fitnessapp / com.playsimple.fitnessapp.ExerciseStartActivity}:   java.lang.NullPointerException at   android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2198)   在   android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2257)   在android.app.ActivityThread.access $ 800(ActivityThread.java:139)at   android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1210)   在android.os.Handler.dispatchMessage(Handler.java:102)at   android.os.Looper.loop(Looper.java:136)at   android.app.ActivityThread.main(ActivityThread.java:5086)at   java.lang.reflect.Method.invokeNative(Native Method)at   java.lang.reflect.Method.invoke(Method.java:515)at   com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:785)   在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)at   dalvik.system.NativeStart.main(Native方法)引起:   java.lang.NullPointerException at   com.playsimple.fitnessapp.data.SavingData.getDifficulty(SavingData.java:91)   在   com.playsimple.fitnessapp.ExerciseStartActivity.initExercise(ExerciseStartActivity.java:69)   在   com.playsimple.fitnessapp.ExerciseStartActivity.onCreate(ExerciseStartActivity.java:64)   在android.app.Activity.performCreate(Activity.java:5248)处   android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1110)   在   android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2162)   ComponentInfo {com.playsimple.fitnessapp / com.playsimple.fitnessapp.ExerciseStartActivity}:   java.lang.NullPointerException at   android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1647)   在   android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663)   在android.app.ActivityThread.access $ 1500(ActivityThread.java:117)at   android.app.ActivityThread $ H.handleMessage(ActivityThread.java:931)at   android.os.Handler.dispatchMessage(Handler.java:99)at   android.os.Looper.loop(Looper.java:130)at   android.app.ActivityThread.main(ActivityThread.java:3683)at   java.lang.reflect.Method.invokeNative(Native Method)at   java.lang.reflect.Method.invoke(Method.java:507)at   com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:889)   在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:647)at   dalvik.system.NativeStart.main(Native方法)引起:   java.lang.NullPointerException at   com.playsimple.fitnessapp.data.SavingData.getDifficulty(SavingData.java:91)   在   com.playsimple.fitnessapp.ExerciseStartActivity.initExercise(ExerciseStartActivity.java:69)   在   com.playsimple.fitnessapp.ExerciseStartActivity.onCreate(ExerciseStartActivity.java:64)   在   android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)   在   android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611)

2 个答案:

答案 0 :(得分:1)

您正在此处创建主要活动的实例:

public static MainActivity mainActivity;

然后使用它调用共享Prefs ..从主活动中获取上下文对象,然后调用它。 也可以使用它包括MODE_PRIVATE参数:

SharedPreferences userDetails = context.getSharedPreferences("userdetails", MODE_PRIVATE);

this detailed answer。 另请参阅[Context getSharedPreferences](http://developer.android.com/reference/android/content/Context.html#getSharedPreferences(java.lang.String,int))

的文档

答案 1 :(得分:0)

尝试从其他活动中调用您的sharedPreferences,

SharedPreferences settings = mainActivity.getSharedPreferences(PREFS_NAME, MODE_PRIVATE);