首页 > 解决方案 > 静态 SharedPreferences 变量上的 NullPointerException

问题描述

不幸的是,我自己无法重现此错误,但在某些 POJO 的这一行中的 Google Play 控制台中报告了 NullPointerException:

String mypref = MainActivity.prefs.getString("mypref", null);

MainActivity 的相关部分如下所示:

public class MainActivity extends AppCompatActivity {
    public static SharedPreferences prefs;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        PreferenceManager.setDefaultValues(this, R.xml.preferences, false);
        prefs = PreferenceManager.getDefaultSharedPreferences(this);
        ...
    }

MainActivity 是清单中最先列出的活动,是应用启动时的目标活动:

    <activity android:name=".MainActivity"
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

该错误似乎很少出现,似乎很少有用户受到影响。但是,我仍然想了解这里发生了什么。在我的应用程序中的其他地方以相同的方式访问 prefs 变量,这些地方没有在 Google Play 控制台中报告。

我的看法是 prefs 变量本身必须为空。这意味着 MainActivity 的 onCreate 方法没有被执行。这怎么可能?

标签: android

解决方案


当用户离开您的应用时,Android 操作系统可以终止您的应用进程。当它这样做时,任何保存为onSaveInstanceState()回调的一部分的东西都将丢失。这包括static字段。

在您的特定情况下,无论如何都不需要这个静态变量。通过以现在的方式做事,您唯一获得的好处就是您可以使用它getDefaultSharedPreferences()来确定偏好商店的名称。如果您Context.getSharedPreferences()手动使用并传递该名称,您可以从应用程序中的任何位置访问相同的首选项存储。


推荐阅读