【问题标题】:Fragment onSaveInstanceState() called after onDestroyView()在 onDestroyView() 之后调用的片段 onSaveInstanceState()
【发布时间】:2022-12-15 18:20:31
【问题描述】:

由于片段的某些生命周期问题,应用程序开始出现一些崩溃(无法 100% 重现)。

我正在使用视图绑定,并且我正在根据 Android 的建议手动使绑定无效,以避免在出现以下情况时占用大量内存

private var _binding: FragmentCustomBinding? = null
private val binding get() = _binding!!

override fun onCreateView(
    inflater: LayoutInflater, container: ViewGroup?,
    savedInstanceState: Bundle?
): View = FragmentCustomBinding.inflate(inflater, container, false).also {
    _binding = it
}.root

override fun onDestroyView() {
    _binding = null
    super.onDestroyView()
}

override fun onSaveInstanceState(outState: Bundle) {
    outState.apply {
        putString(BUNDLE_KEY_SOME_VALUE, binding.etSomeValue.text.toString())
    }
    super.onSaveInstanceState(outState)
}

我在 onSaveInstanceState() 中得到一个 NullPointerException,因为 bindingnull,因为这是在 onDestroyView() 之后调用的。

知道如何在不手动创建保存状态并手动处理它的情况下解决这个问题吗?

【问题讨论】:

    标签: android nullpointerexception fragment android-lifecycle android-savedstate


    【解决方案1】:

    binding = null 导致了这个问题。要以正确的方式摆脱 _binding = null 使用此代码:

    class CustomFragment : Fragment(R.layout.fragment_custom) {
    
      private val binding: FragmentCustomBinding by viewBinding()
      
      override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
          super.onViewCreated(view, savedInstanceState)
          // Any code we used to do in onCreateView can go here instead
      }
    }
    

    根据article on this workaround

    此技术使用一个可选的支持字段和一个非可选的 val,它仅在 onCreateView 和 onDestroyView 之间有效。 在 onCreateView 中,可选的支持字段被设置,在 onDestroyView 中,它被清除。这修复了内存泄漏!

    【讨论】:

    • 感谢你的回答。事实上,这就是原因并且它按预期工作,它确保视图不会超过片段。没有按预期工作的是当视图不再存在时调用 onSaveInstanceState 的事实。它不应该创建这样的场景。我可以只使用安全运算符,但我会遇到状态未保存的情况。据我所知,您的解决方案依赖于委托属性。这有助于减少一些样板代码,但我认为它做同样的事情,我不确定它是否真的解决了问题。
    【解决方案2】:

    似乎答案在于片段的处理方式,即使它们没有视图,因为 Activity 状态的更改仍然可以触发 onSavedInstanceState() 因此我可以在 onSavedInstanceState() 的场景中结束,但是没有观点。 这似乎是有意为之,因为无论是否有视图,片段仍然受到支持。

    建议使用视图 API 来保存和恢复状态(或我的SavedStateRegistery)。

    可以在这里找到更多详细信息:https://issuetracker.google.com/issues/245355409

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-08
      • 2013-09-06
      • 2014-01-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多