公共共享首选项导致应用程序崩溃

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:从设置外部更改相机权限会导致应用程序共享首选项清除

共享首选项和 onPause 不起作用

适用于 iOS 的 Google Plus API:共享功能 - 在本机对话框共享中触摸“公共”时应用程序崩溃?

在导致空指针的活动中使用共享首选项,这让我起了作用