【发布时间】:2020-10-12 08:04:57
【问题描述】:
我正在像suggested in Google docs 这样设置我的片段:
private var _binding: MyBinding? = null
private val binding get() = _binding!!
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
_binding = MyBinding.inflate(inflater, container, false)
override fun onDestroyView() {
super.onDestroyView()
_binding = null
}
现在我正在调用一个协程,据我所知,它应该被限定在这个片段的生命周期内。它有一个更长的网络调用,然后成功:
lifecycleScope.launch(Dispatchers.Main) {
when (myViewModel.loadFromNetwork(url)) {
true -> responseSuccess()
false -> responseFailure()
}
}
private suspend fun responseSuccess() {
binding.stateSuccess.visibility = View.VISIBLE
// ...
}
现在,当我在 loadFromNetwork 仍在加载时按下 Android 系统返回按钮时,片段被破坏并调用 onDestroyView()。因此binding 现在是null。我收到了kotlin.KotlinNullPointerException。我不太明白为什么responseSuccess() 仍在执行,即使我认为lifecycleScope 是专门针对这种情况的。根据Google Docs:
为每个 Lifecycle 对象定义一个 LifecycleScope。当生命周期被销毁时,在这个范围内启动的任何协程都会被取消。
我了解此代码可以通过一些更改和一些手动空检查来修复,但我想了解如何在没有样板的情况下以预期的方式修复此问题。如果不完全是这样,那么使用生命周期范围来感知生命周期的目的是什么?
【问题讨论】:
-
myViewModel.loadFromNetwork() 是什么样的挂起函数?是可取消的挂起功能吗?
标签: android kotlin kotlin-coroutines android-viewbinding