公共共享首选项导致应用程序崩溃
Posted
技术标签:
【中文标题】公共共享首选项导致应用程序崩溃【英文标题】:Public shared preferences causes app to crash 【发布时间】:2016-01-23 23:12:29 【问题描述】:我需要有一个可以通过我的班级中的多个方法访问的共享首选项。为此,我将共享首选项设为公开,如下所示:
public SharedPreferences myPreference = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
然后我可以通过两种不同的方法访问它:
SharedPreferences.Editor editor=myPreference.edit();
当我这样做时,应用程序崩溃了,这是 logcat:
01-23 18:02:51.764 20873-20873/com.example.griffin.dinnerplannerapp E/androidRuntime: 致命例外: main 01-23 18:02:51.764 20873-20873/com.example.griffin.dinnerplannerapp E/AndroidRuntime: 流程:com.example.griffin.dinnerplannerapp,PID:20873 01-23 18:02:51.764 20873-20873/com.example.griffin.dinnerplannerapp E/AndroidRuntime: java.lang.RuntimeException: 无法实例化 活动 组件信息com.example.griffin.dinnerplannerapp/com.example.griffin.dinnerplannerapp.sundayActivity: java.lang.NullPointerException:尝试调用虚拟方法 'android.content.Context android.content.Context.getApplicationContext()' 在一个空对象上 参考 01-23 18:02:51.764 20873-20873/com.example.griffin.dinnerplannerapp E/AndroidRuntime: 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2282) 01-23 18:02:51.764 20873-20873/com.example.griffin.dinnerplannerapp E/Android运行时:在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2439) 01-23 18:02:51.764 20873-20873/com.example.griffin.dinnerplannerapp E/Android运行时:在 android.app.ActivityThread.access$800(ActivityThread.java:162) 01-23 18:02:51.764 20873-20873/com.example.griffin.dinnerplannerapp E/Android运行时:在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1348) 01-23 18:02:51.764 20873-20873/com.example.griffin.dinnerplannerapp E/Android运行时:在 android.os.Handler.dispatchMessage(Handler.java:102) 01-23 18:02:51.764 20873-20873/com.example.griffin.dinnerplannerapp E/AndroidRuntime: 在 android.os.Looper.loop(Looper.java:135) 01-23 18:02:51.764 20873-20873/com.example.griffin.dinnerplannerapp E/Android运行时:在 android.app.ActivityThread.main(ActivityThread.java:5421) 01-23 18:02:51.764 20873-20873/com.example.griffin.dinnerplannerapp E/AndroidRuntime: 在 java.lang.reflect.Method.invoke(Native 方法) 01-23 18:02:51.764 20873-20873/com.example.griffin.dinnerplannerapp E/AndroidRuntime: 在 java.lang.reflect.Method.invoke(Method.java:372) 01-23 18:02:51.764 20873-20873/com.example.griffin.dinnerplannerapp E/AndroidRuntime: 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:914) 01-23 18:02:51.764 20873-20873/com.example.griffin.dinnerplannerapp E/Android运行时:在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:707) 01-23 18:02:51.764 20873-20873/com.example.griffin.dinnerplannerapp E/AndroidRuntime:引起:java.lang.NullPointerException:尝试 调用虚拟方法'android.content.Context android.content.Context.getApplicationContext()' 在一个空对象上 参考 01-23 18:02:51.764 20873-20873/com.example.griffin.dinnerplannerapp E/AndroidRuntime: 在 android.content.ContextWrapper.getApplicationContext(ContextWrapper.java:106) 01-23 18:02:51.764 20873-20873/com.example.griffin.dinnerplannerapp E/Android运行时:在 com.example.griffin.dinnerplannerapp.sundayActivity.(sundayActivity.java:61) 01-23 18:02:51.764 20873-20873/com.example.griffin.dinnerplannerapp E/Android运行时:在 java.lang.reflect.Constructor.newInstance(Native Method) 01-23 18:02:51.764 20873-20873/com.example.griffin.dinnerplannerapp E/AndroidRuntime:在 java.lang.Class.newInstance(Class.java:1606) 01-23 18:02:51.764 20873-20873/com.example.griffin.dinnerplannerapp E/Android运行时:在 android.app.Instrumentation.newActivity(Instrumentation.java:1066) 01-23 18:02:51.764 20873-20873/com.example.griffin.dinnerplannerapp E/Android运行时:在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2272) 01-23 18:02:51.764 20873-20873/com.example.griffin.dinnerplannerapp E/Android运行时:在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2439) 01-23 18:02:51.764 20873-20873/com.example.griffin.dinnerplannerapp E/Android运行时:在 android.app.ActivityThread.access$800(ActivityThread.java:162) 01-23 18:02:51.764 20873-20873/com.example.griffin.dinnerplannerapp E/Android运行时:在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1348) 01-23 18:02:51.764 20873-20873/com.example.griffin.dinnerplannerapp E/Android运行时:在 android.os.Handler.dispatchMessage(Handler.java:102) 01-23 18:02:51.764 20873-20873/com.example.griffin.dinnerplannerapp E/AndroidRuntime:在 android.os.Looper.loop(Looper.java:135) 01-23 18:02:51.764 20873-20873/com.example.griffin.dinnerplannerapp E/Android运行时:在 android.app.ActivityThread.main(ActivityThread.java:5421) 01-23 18:02:51.764 20873-20873/com.example.griffin.dinnerplannerapp E/AndroidRuntime: 在 java.lang.reflect.Method.invoke(Native 方法) 01-23 18:02:51.764 20873-20873/com.example.griffin.dinnerplannerapp E/AndroidRuntime: 在 java.lang.reflect.Method.invoke(Method.java:372) 01-23 18:02:51.764 20873-20873/com.example.griffin.dinnerplannerapp E/Android运行时:在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:914) 01-23 18:02:51.764 20873-20873/com.example.griffin.dinnerplannerapp E/Android运行时:在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:707)
任何帮助将不胜感激提前感谢。
【问题讨论】:
NullPointerException at getDefaultSharedPreferences的可能重复 【参考方案1】:您不能在调用 onCreate()
方法之前调用 getApplicationContext()
,这可能是它返回 null 并给您此错误的原因。
因此,我建议您在onCreate()
中设置该字段,或者在需要使用SharedPreferences
的任何地方直接使用PreferenceManager.getDefaultSharedPreferences(getApplicationContext())
。
【讨论】:
【参考方案2】:您是否在 Manifest 中声明了访问外部存储的权限?
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
编辑 1: 在 LogCat 中搜索了一个 Detail 发现这个
java.lang.NullPointerException: 尝试调用虚拟方法'android.content.Context android.content.Context.getApplicationContext()
看看这里Get application context returns null也许这会有所帮助。
编辑 2: 我添加了链接的主要部分:
您应该在onCreate()
中创建一个静态上下文实例,并确保您声明了AndroidManifest.xml
。
上下文实例的代码:
public class MyApp extends Application
//私有静态MyApp实例; 私有静态上下文 mContext;
public static MyApp getInstance()
return instance;
public static Context getContext()
// return instance.getApplicationContext();
return mContext;
@Override
public void onCreate()
super.onCreate();
// instance = this;
mContext = getApplicationContext();
还有清单:
<application android:name="com.mypackage.MyApp">
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
...
</application>
【讨论】:
如果声誉低,我无法发表评论,很抱歉。以上是关于公共共享首选项导致应用程序崩溃的主要内容,如果未能解决你的问题,请参考以下文章
在使用 TimePicker 或 NumberPicker 查看对话框首选项时旋转 Android 设备会导致应用程序崩溃
在 Swift 中打开一个关闭的 NSWindow 会导致应用程序崩溃
Android:从设置外部更改相机权限会导致应用程序共享首选项清除