在我的 fragment 中,我在很多地方都使用了资源字符串。 理想情况下,一切正常。
但是,我经常收到关于 IllegalStateException
的崩溃报告,说 Fragment 没有附加到 Activity。
我能想象到的一种可能的解决方案是使用 isAdded()
方法,该方法返回 fragment 是否附加到 Activity ,但在访问字符串资源之前在所有地方使用它对我来说似乎不是正确的解决方案,因为它会破坏流程。
另外,我可以使用下面的实现,不确定它是否正确?
在fragment的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
吗?
最佳答案
Can I be assured that using this will stop the IllegalStateExceptions?
不,绝对不是。 Fragment.getString()
在内部委托(delegate)给 requireContext().getResources()
,requireContext()
只会返回一个值,而 Fragment
附加到 Activity
。所以你真的会遇到同样的问题,但代码更多。
您的问题是您在生命周期的无效部分调用了 getString()
。你提到你在 Retrofit 响应中发生了这种情况,所以我的假设是你在 Fragment
中提交网络请求,并提供一个匿名响应监听器(它包含对你的引用 fragment
)。即使在 Fragment
分离后,该请求仍将继续,然后在您的响应监听器中调用 getString()
。
考虑移动到 Android Architecture Components (特别是 ViewModel
和 LiveData
),并让您的 ViewModel
执行请求,并将结果发布到 LiveData
(您的 Fragment
可以观察)。这样你就可以保证只在有效的生命周期状态下处理结果,而且请求将在配置更改后继续存在。
关于android - IllegalStateException - Fragment.getResources,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51751034/