IllegalStateException-Fragment.getResources

时间:2018-08-08 15:58:39

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

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

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

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

@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吗?

1 个答案:

答案 0 :(得分:3)

  

我可以确保使用此方法将停止IllegalStateExceptions吗?

不,绝对不是。 Fragment.getString()内部委托给requireContext().getResources(),而requireContext()仅在将Fragment附加到Activity时返回一个值。因此,使用更多代码,您确实会遇到同样的问题。

您的问题是,您在生命周期的无效部分正在调用getString()。您提到您是在改造响应中发生这种情况,因此我的假设是您要在Fragment内提交网络请求,并提供匿名响应侦听器(其中包含对您的{{1 }})。即使分离了Fragment,该请求也会继续,然后在响应侦听器中调用Fragment

请考虑移至Android Architecture Components(特别是ViewModelLiveData),并让您的getString()执行请求,然后将结果发布到ViewModel (您的LiveData可以观察到)。这样一来,您可以保证只在有效的生命周期状态下处理结果,此外,该请求将在配置更改后仍然有效。