android - 无法恢复 Activity - SharedPreferences

标签 android sharedpreferences onresume

我正在尝试实现一种“首次启动”方法,该方法将在用户首次打开应用时打开特定 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.access$800(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.access$800(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 方法有关?

最佳答案

您已将您的 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 方法中

关于android - 无法恢复 Activity - SharedPreferences,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28725487/

相关文章:

android - onResume 在应用程序处于后台或手机 sleep 后未调用

android - OnResume 在 fragment 中多次调用

java - 杀死应用程序时 SharedPreferences 消失

android - 在 fragment 中使用 Google Map v2 的推荐方法是什么?

android - Google Smart Lock disableAutoSignIn() 不会阻止下一个应用程序打开时的选择器对话框

java (android) 从头开始​​创建 JSONObject

java - 如何在 TextView 中显示 ArrayList 中的字符串

java - 如何使用来自不同 Activity 的 SharedPreferences?

android - 应用程序崩溃并给出运行时错误执行未恢复的 Activity 暂停

java - 比较器以错误的顺序给出数据