android - 静态 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 操作系统可以终止您的应用进程。当它这样做时,任何未保存为onSaveInstanceState()
回调的一部分的东西都将丢失。这包括static
字段。
在您的特定情况下,无论如何都不需要这个静态变量。通过以现在的方式做事,您唯一获得的好处就是您可以使用它getDefaultSharedPreferences()
来确定偏好商店的名称。如果您Context.getSharedPreferences()
手动使用并传递该名称,您可以从应用程序中的任何位置访问相同的首选项存储。
推荐阅读
- c# - 在目录外选择扩展名符合预定义要求的最新文件
- javascript - TensorFlow Estimator 到 TensorFlow JS
- python-3.x - 出现错误:即使我安装了烧瓶,VSCode 中的“没有名为烧瓶的模块”
- gmail-api - 如何在谷歌表格单元格中显示我的 gmail 中的电子邮件总数
- windows - WinSCP 错误 5 访问被拒绝,同时通过命令行下载
- apache - Apache 2.4 和 /tmp 中的别名
- reactjs - Ant 设计日期和时间选择器不通过 Formik 传递值(反应)
- javascript - 嵌套函数中的同名变量
- c++ - 测试身份验证 desktop_app 时的 Firebase 内部错误
- node.js - throw new TypeError('app.use() 需要中间件函数'); 会话错误