【问题标题】:Why the fragment's context null inside lifecycleScope为什么片段的上下文在生命周期范围内为空
【发布时间】:2019-06-02 13:33:54
【问题描述】:

我在片段中使用生命周期范围时遇到问题,我认为如果片段与活动分离,那么生命周期范围将取消协程作业。

我已经阅读了生命周期范围的代码,我认为这不可能发生。 我唯一能做的就是添加一个前置条件“isAdded”来解决这个问题。

private fun updateUserInfo(user: User) = lifecycleScope.launch {
   textView.text = getString(R.string.foo)
}

这段代码抛出

java.lang.IllegalStateException androidx.fragment.app.Fragment.requireContext (Fragment.java:696)

希望有人能帮我解释一下生命周期范围的机制。

【问题讨论】:

  • 此时您调用updateUserInfo() 的原因可能是,您的Fragment 尚未附加到Activity。
  • 如果Fragment没有附加到Activity上,Fragment的lifecycleScope还在运行子协程作业吗?
  • 没试过,但我猜是这样,因为 Fragment 的生命周期始于 onCreate 而不是 onAttach,这是附加上下文的地方

标签: android kotlin lifecycle coroutine


【解决方案1】:

Fragment的lifecycleScope(与生命周期本身相同)并不总是有上下文,上下文只有在onAttach之后和onDetach之前才可用,以防在onDetach之后保留Fragment处于活动状态,因此上下文可以为null。

因为你不仅要访问上下文,还要接触视图,所以你应该使用viewLifecycleOwner.lifecycleScope,这将允许你在Fragment的View生命周期中启动协程,所以你总是有上下文并且它取消了onDestroyView

【讨论】:

  • 当使用这个作用域时,launch() 和 launchWhenStarted() 效果是一样的吗?
  • 如果在onStop之后/期间启动它就不一样了,launchWhenStarted只会在Fragment再次启动时执行lambda,launch会立即执行(在Fragment暂停/停止时视图不会被破坏),但两者将被取消 onViewDestroy
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多