【问题】
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了。
转载请注明:在路上 » 【已解决】Android中PreferenceManager.getDefaultSharedPreferences出现java.lang.NullPointerException