【问题标题】:IllegalStateException - Fragment.getResourcesIllegalStateException - Fragment.getResources
【发布时间】:2018-08-08 15:58:39
【问题描述】:

在我的片段中,我在很多地方都使用了资源字符串。 理想情况下,一切正常。

但是,我经常收到IllegalStateException 的崩溃报告,说 Fragment 未附加到活动。 我可以想象的一种可能的解决方案是使用isAdded() 方法,如果片段是否附加到活动,则返回,但是在访问字符串资源之前在所有地方使用它对我来说似乎不是正确的解决方案,因为它可能会中断流程。

另外,我可以使用以下实现,不确定它是否正确? 在片段的onAttach 上初始化mActivity,然后使用它来获取资源字符串。

@Override
public void onAttach(Context context) {
    super.onAttach(context);
    if (context instanceof Activity) {
        mActivity = (Activity) context;
    }
}

而不是

 getString(R.string.string_resource)

使用

mActivity.getString(R.string.string_resource)

我可以确定使用它会停止IllegalStateExceptions吗?

【问题讨论】:

  • 您能发布ActivityFragment 代码吗?或者你得到错误的函数?
  • @SusmitAgrawal 整个活动和片段代码会很麻烦,我在改造请求的 onResponse 方法中遇到了这个异常。
  • @MihirPatel 请提供IllegalStateException 的堆栈跟踪以及此跟踪中列出的方法。听起来问题在于您在生命周期中过早执行某些操作(在调用 onAttach 之前)。
  • 你能发布堆栈跟踪吗?

标签: android android-fragments android-activity android-fragmentactivity


【解决方案1】:

我可以确定使用它会阻止 IllegalStateExceptions 吗?

不,绝对不是。 Fragment.getString() 内部委托给requireContext().getResources(),而requireContext() 只会在Fragment 附加到Activity 时返回一个值。所以你真的会有同样的问题,有更多的代码。

您的问题是您在生命周期的无效部分调用getString()。你提到你在改造响应中发生了这种情况,所以我的假设是你在Fragment 中提交一个网络请求,并提供一个匿名响应侦听器(它包含对你的Fragment 的引用)。即使Fragment 被分离,该请求仍将继续,然后在您的响应侦听器中调用getString()

考虑转移到Android Architecture Components(特别是ViewModelLiveData),让您的ViewModel 执行请求,并将结果发布到LiveData(您的Fragment 可以观察到)。这样您就可以保证只在有效的生命周期状态下处理结果,而且请求将在配置更改后继续存在。

【讨论】:

  • 谢谢@kcoppock。您能否也分享一些您所指的架构组件的参考资料?这会很有帮助。
  • 当然,我已经为 Arch 组件、ViewModel 和 LiveData 介绍文档添加了一些内联链接。
  • 我在生产 Fragment onActivityCreated() 方法中遇到了这些崩溃,这些方法除了调用 getString()(无后台请求)之外什么都不做。我无法复制,也不知道如何预防 - 将可能使用 getResources() 的所有内容移至 onResume()
猜你喜欢
  • 2014-04-17
  • 2014-11-16
  • 2017-05-13
  • 2016-01-20
  • 1970-01-01
  • 1970-01-01
  • 2015-01-20
  • 2011-08-29
相关资源
最近更新 更多