我注意到我的应用程序生成了类似Tried to access SharedPreferences but context is null object reference
的错误。当用户在逻辑尝试访问需要对象Context
的同一微秒关闭应用程序时,它们非常随机地发生。因此,应用关闭,但正在传递请求,并且该方法尝试使用上下文对象。发生的情况是应用关闭,但用户看到崩溃弹出窗口。
这在用户眼中看起来并不好。
现在,这里的错误是什么?我真的应该检查处理Context
对象的每个方法的if (context != null)
吗?在处理Context
的每个方法中使用try/catch
?
或者,也许我应该放弃传递Activity
Context
的习惯并使用全局应用程序的上下文?
所以我问的是一个方向,如何成功解决所有这些问题,而不是如何在代码中做到这一点(后者真的很简单)。
使用可以绑定到整个应用程序的对象时,最好使用 getApplicationContext()
。 例如SharedPreferences
。只有当您想在屏幕上显示某些内容(添加新片段、显示DialogFragment
、需要FragmentManager
实例的内容)时,您才需要活动上下文。
确保尊重活动/片段的生命周期,并且不会有空上下文。此外,您需要检查上下文是否为 null,如果您有异步请求,该请求可能会在活动被终止后返回。
您必须检查 2 件事:
- 上下文是否为空
- 如果您正在更改某些 UI 元素,是否允许您这样做。这基本上意味着您的活动处于恢复状态。
当您的活动收到对 onStop() 方法的调用时,它不是 更长的可见时间,应该释放几乎所有资源 [...]。一旦您的活动停止, 如果需要恢复系统,系统可能会销毁实例 记忆。在极端情况下,系统可能会简单地杀死您的应用程序 过程 [...]。
从 http://developer.android.com/training/basics/activity-lifecycle/stopping.html
@Override
protected void onStop() {
super.onStop();
// release resources (e.g. stop/pause async tasks etc)
}