【已解决】Android中PreferenceManager.getDefaultSharedPreferences出现java.lang.NullPointerException

【问题】

Android中,先是写成:

PreferenceManager.getDefaultSharedPreferences(this)

则会出现:

The method getDefaultSharedPreferences(Context) in the type PreferenceManager is not applicable for the arguments (AppConfig)

然后改为如下代码:

  Context context = AppContext.getInstance();
  SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(context);

运行出错:

05-13 13:51:20.192: E/AndroidRuntime(5290): Caused by: java.lang.NullPointerException
05-13 13:51:20.192: E/AndroidRuntime(5290): at android.content.ContextWrapper.getSharedPreferences(ContextWrapper.java:168)
05-13 13:51:20.192: E/AndroidRuntime(5290): at android.preference.PreferenceManager.getDefaultSharedPreferences(PreferenceManager.java:366)
05-13 13:51:20.192: E/AndroidRuntime(5290): at xxx.yyy.zzz.AppConfig.getCurrentCommunicationType(AppConfig.java:52)
......
05-13 13:51:20.192: E/AndroidRuntime(5290): at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1017)
05-13 13:51:20.192: E/AndroidRuntime(5290): at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4552)
05-13 13:51:20.192: E/AndroidRuntime(5290): ... 10 more

【解决过程】

1.搜:

android.content.ContextWrapper.getSharedPreferences java.lang.NullPointerException

找到:

java – Android: NullPointerException Working With SharedPreferences – Stack Overflow

NullPointerException in SharedPreferences Android – Stack Overflow

java – I can’t figure out how to use an android PreferenceActivity – Stack Overflow

好像说是:

必须是onCreate执行完毕才可以的。

而此处,貌似真的我的App中,是正在处于onCreate中,没有真正执行完毕的。

但是不知道如何解决。

2.最后去看了相关代码:

AppContext.java

然后注意到是:

public class AppContext extends Application xxx {
public static String appContext = "appContext"; 
 private Application parentApp;

 public Application getAppContext() {
  return parentApp;
 }
 private static class LazyHolder {
  static AppContext instance = new AppContext();
 }
 public static AppContext getInstance() {
  return LazyHolder.instance;
 }

可以看出:

getInstance只是获得了AppContext的实例

而getAppContext才是获得了(父级)的application。

所以去改为:

  Context context = AppContext.getInstance().getAppContext();
  SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(context);

就解决问题了:

先获得了真正的context,然后再去调用对应的getDefaultSharedPreferences,就OK了。

 

【总结】

其实此处已经和是否onCreate函数执行完毕无关,而只需要确保获得了当前的app的context后,即可调用:

PreferenceManager.getDefaultSharedPreferences(context)

就可以获得当前的SharedPreferences了。



发表评论

电子邮件地址不会被公开。 必填项已用*标注

无觅相关文章插件,快速提升流量