【问题标题】:getSharedPreferences Null Pointer Exception on some devices某些设备上的 getSharedPreferences 空指针异常
【发布时间】:2015-01-09 17:14:20
【问题描述】:

我正在使用 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:无法启动活动
组件信息{com.playsimple.fitnessapp/com.playsimple.fitnessapp.ExerciseStartActivity}: java.lang.NullPointerException 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2198) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2257) 在 android.app.ActivityThread.access$800(ActivityThread.java:139) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1210) 在 android.os.Handler.dispatchMessage(Handler.java:102) 在 android.os.Looper.loop(Looper.java:136) 在 android.app.ActivityThread.main(ActivityThread.java:5086) 在 java.lang.reflect.Method.invokeNative(Native Method) 在 java.lang.reflect.Method.invoke(Method.java:515) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601) 在 dalvik.system.NativeStart.main(Native Method) 原因: java.lang.NullPointerException 在 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) 组件信息{com.playsimple.fitnessapp/com.playsimple.fitnessapp.ExerciseStartActivity}: java.lang.NullPointerException 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1647) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663) 在 android.app.ActivityThread.access$1500(ActivityThread.java:117) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:931) 在 android.os.Handler.dispatchMessage(Handler.java:99) 在 android.os.Looper.loop(Looper.java:130) 在 android.app.ActivityThread.main(ActivityThread.java:3683) 在 java.lang.reflect.Method.invokeNative(Native Method) 在 java.lang.reflect.Method.invoke(Method.java:507) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:889) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:647) 在 dalvik.system.NativeStart.main(Native Method) 原因: java.lang.NullPointerException 在 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)

【问题讨论】:

  • NullPointerException at com.playsimple.fitnessapp.data.SavingData.getDifficulty

标签: java android sharedpreferences


【解决方案1】:

您正在这里创建主要活动的实例:

public static MainActivity mainActivity;

然后调用共享首选项.. 使用它。从您的主要活动中获取上下文对象,然后调用它。 也使用这个包括 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) 的文档

【讨论】:

  • 为什么要使用 MODE_PRIVATE?不是0吗?
  • 如果未找到 MODE_PRIVATE,请使用 Context.MODE_PRIVATE
  • 所以不应该用静态方法,改成普通方法吧?
  • 从你调用函数的任何地方,也获取上下文对象,getRestTime(Context context),然后是 context.getSharedPreferences(...)。关于静态的东西,我不知道是否应该使用它。但变量 mainActivity 似乎是问题所在。
  • 当我做 mainActivity.MODE_PRIVATE 我得到这个警告:“静态字段 Context.MODE_PRIVATE 应该以静态方式访问”。这样做 Context.MODE_PRIVATE 是否安全?
【解决方案2】:

尝试从其他 Activity 调用您的 sharedPreferences,

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

【讨论】:

  • 从另一个Activity调用是什么意思?你的意思是我应该使用它而不是 SavingData.getRestTime();
  • savingData 不是您发布的代码中的活动。由于它是一个类,使用带有首选项名称和模式的 getSharedPreferences 应该可以工作。
猜你喜欢
  • 1970-01-01
  • 2017-12-13
  • 1970-01-01
  • 1970-01-01
  • 2012-01-28
  • 1970-01-01
  • 2014-09-03
  • 2021-01-19
  • 2019-07-18
相关资源
最近更新 更多