无法恢复 activity - SharedPreferences
Unable to resume activity - SharedPreferences
我正在尝试实现一种 "first-launch" 方法,该方法将在用户首次打开应用程序时打开特定 activity。
我有一个名为 prefs 的 SharedPreferences:
public class MainActivity extends ActionBarActivity {
SharedPreferences prefs = null;
public static final String DEFAULT = "N/A";
@Override
protected void onCreate(Bundle savedInstanceState) { ...
现在,在我的 onResume 方法中:
@Override
protected void onResume() {
super.onResume();
if (prefs.getBoolean("firstrun", true)) {
// Do first run stuff here then set 'firstrun' as false
// using the following line to edit/commit prefs
Toast.makeText(this, "Hello", Toast.LENGTH_SHORT).show();
prefs.edit().putBoolean("firstrun", false).apply();
}
}
这在我也想拥有此功能的其他应用程序中工作得很好。但是在这个项目中,它失败了:
java.lang.RuntimeException: Unable to resume activity {com.heavyfork.partystarter/com.heavyfork.partystarter.MainActivity}: java.lang.NullPointerException: Attempt to invoke interface method 'boolean android.content.SharedPreferences.getBoolean(java.lang.String, boolean)' on a null object reference
at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3224)
at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3257)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2479)
at android.app.ActivityThread.access0(ActivityThread.java:144)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1359)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:155)
at android.app.ActivityThread.main(ActivityThread.java:5696)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1028)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:823)
Caused by: java.lang.NullPointerException: Attempt to invoke interface method 'boolean android.content.SharedPreferences.getBoolean(java.lang.String, boolean)' on a null object reference
at com.heavyfork.partystarter.MainActivity.onResume(MainActivity.java:258)
at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1331)
at android.app.Activity.performResume(Activity.java:6044)
at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3207)
at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3257)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2479)
at android.app.ActivityThread.access0(ActivityThread.java:144)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1359)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:155)
at android.app.ActivityThread.main(ActivityThread.java:5696)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1028)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:823)
抱歉,奇怪的代码格式。
有谁知道这可能是什么原因造成的,我认为这与 onResume 方法有关?
您正在获得 NPE。因为你还没有初始化sharedPreference,所以当前是null。
请先这样做,然后再做任何有偏好的事情。
pref = context.getSharedPreferences("pref_name", Context.MODE_PRIVATE);
您已将 SharedPreferences prefs
初始化为 null
,因此是 NPE。
要访问默认的 SharedPreferences,请执行以下操作
SharedPreferences sharedPref = getActivity().getPreferences(Context.MODE_PRIVATE);
boolean first = prefs.getBoolean("firstrun", true)
那么,你可以继续做
if (first) {
// Do first run stuff here then set 'firstrun' as false
// using the following line to edit/commit prefs
Toast.makeText(this, "Hello", Toast.LENGTH_SHORT).show();
prefs.edit().putBoolean("firstrun", false).apply();
}
}
在你的onCreate
方法中
我正在尝试实现一种 "first-launch" 方法,该方法将在用户首次打开应用程序时打开特定 activity。
我有一个名为 prefs 的 SharedPreferences:
public class MainActivity extends ActionBarActivity {
SharedPreferences prefs = null;
public static final String DEFAULT = "N/A";
@Override
protected void onCreate(Bundle savedInstanceState) { ...
现在,在我的 onResume 方法中:
@Override
protected void onResume() {
super.onResume();
if (prefs.getBoolean("firstrun", true)) {
// Do first run stuff here then set 'firstrun' as false
// using the following line to edit/commit prefs
Toast.makeText(this, "Hello", Toast.LENGTH_SHORT).show();
prefs.edit().putBoolean("firstrun", false).apply();
}
}
这在我也想拥有此功能的其他应用程序中工作得很好。但是在这个项目中,它失败了:
java.lang.RuntimeException: Unable to resume activity {com.heavyfork.partystarter/com.heavyfork.partystarter.MainActivity}: java.lang.NullPointerException: Attempt to invoke interface method 'boolean android.content.SharedPreferences.getBoolean(java.lang.String, boolean)' on a null object reference
at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3224)
at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3257)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2479)
at android.app.ActivityThread.access0(ActivityThread.java:144)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1359)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:155)
at android.app.ActivityThread.main(ActivityThread.java:5696)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1028)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:823)
Caused by: java.lang.NullPointerException: Attempt to invoke interface method 'boolean android.content.SharedPreferences.getBoolean(java.lang.String, boolean)' on a null object reference
at com.heavyfork.partystarter.MainActivity.onResume(MainActivity.java:258)
at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1331)
at android.app.Activity.performResume(Activity.java:6044)
at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3207)
at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3257)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2479)
at android.app.ActivityThread.access0(ActivityThread.java:144)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1359)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:155)
at android.app.ActivityThread.main(ActivityThread.java:5696)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1028)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:823)
抱歉,奇怪的代码格式。
有谁知道这可能是什么原因造成的,我认为这与 onResume 方法有关?
您正在获得 NPE。因为你还没有初始化sharedPreference,所以当前是null。
请先这样做,然后再做任何有偏好的事情。
pref = context.getSharedPreferences("pref_name", Context.MODE_PRIVATE);
您已将 SharedPreferences prefs
初始化为 null
,因此是 NPE。
要访问默认的 SharedPreferences,请执行以下操作
SharedPreferences sharedPref = getActivity().getPreferences(Context.MODE_PRIVATE);
boolean first = prefs.getBoolean("firstrun", true)
那么,你可以继续做
if (first) {
// Do first run stuff here then set 'firstrun' as false
// using the following line to edit/commit prefs
Toast.makeText(this, "Hello", Toast.LENGTH_SHORT).show();
prefs.edit().putBoolean("firstrun", false).apply();
}
}
在你的onCreate
方法中