A1m*_*A1m 5 android kotlin kotlin-coroutines android-viewbinding
我正在按照 Google 文档中的建议设置 Fragment :
private var _binding: MyBinding? = null
private val binding get() = _binding!!
Run Code Online (Sandbox Code Playgroud)
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
_binding = MyBinding.inflate(inflater, container, false)
Run Code Online (Sandbox Code Playgroud)
override fun onDestroyView() {
super.onDestroyView()
_binding = null
}
Run Code Online (Sandbox Code Playgroud)
现在我正在调用一个协程,据我所知,该协程应限定在此片段的生命周期内。它有一个更长的网络调用,然后成功:
lifecycleScope.launch(Dispatchers.Main) {
when (myViewModel.loadFromNetwork(url)) {
true -> responseSuccess()
false -> responseFailure()
}
}
Run Code Online (Sandbox Code Playgroud)
private suspend fun responseSuccess() {
binding.stateSuccess.visibility = View.VISIBLE
// ...
}
Run Code Online (Sandbox Code Playgroud)
现在,当我在loadFromNetwork
加载时按下 Android 系统后退按钮时,片段会被销毁并被onDestroyView()
调用。因此binding
现在是null
. 我得到一个kotlin.KotlinNullPointerException
. 我不太明白的是为什么responseSuccess()
仍然被执行,即使我认为这lifecycleScope
是专门针对这种情况的。根据谷歌文档:
LifecycleScope 为每个 Lifecycle 对象定义。当生命周期被销毁时,在此范围内启动的任何协程都会被取消。
我知道可以通过一些更改和一些手动空检查来修复此代码,但我想了解如何在没有样板的情况下以预期方式修复此问题。如果不完全是这样,使用生命周期范围来感知生命周期的目的是什么?
归档时间: |
|
查看次数: |
486 次 |
最近记录: |