gpt4 book ai didi

android - Fragment 中的 View 绑定(bind)导致 KotlinNullPointerException 在生命周期范围的协程内运行

转载 作者:行者123 更新时间:2023-12-02 12:55:13 25 4
gpt4 key购买 nike

我正在设置我的 fragment ,如 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
}
现在我正在调用一个协程,据我所知,它应该被限制在这个 fragment 的生命周期内。它有一个更长的网络调用,然后成功:
        lifecycleScope.launch(Dispatchers.Main) {
when (myViewModel.loadFromNetwork(url)) {
true -> responseSuccess()
false -> responseFailure()
}
}
    private suspend fun responseSuccess() {
binding.stateSuccess.visibility = View.VISIBLE
// ...
}
现在,当我按下 Android 系统返回按钮时, loadFromNetwork仍在加载 fragment 被破坏和 onDestroyView()叫做。因此 binding现在是 null .我收到了 kotlin.KotlinNullPointerException .我不太明白为什么 responseSuccess()即使我认为 lifecycleScope 仍在执行中专门针对这种情况。根据 Google Docs :

A LifecycleScope is defined for each Lifecycle object. Any coroutine launched in this scope is canceled when the Lifecycle is destroyed.


我知道可以通过一些更改和一些手动空检查来修复此代码,但我想了解如何在没有样板的情况下以预期的方式修复此问题。如果不完全是这样,那么使用生命周期范围来感知生命周期的目的是什么?

最佳答案

协程取消是 cooperative .这意味着检查取消是协程本身的责任。协程库中的大多数(或可能是全部)挂起操作会检查是否取消,但如果您不调用其中任何一个,则需要按照 here 所述使代码可取消.
在协程中使用 View 的更好选择是使用 lifecycle extensions当生命周期状态不处于所需状态时,它会自动暂停/取消协程。
另请注意,取消只是常规 CancellationException ,所以请检查您是否会意外捕获它。

关于android - Fragment 中的 View 绑定(bind)导致 KotlinNullPointerException 在生命周期范围的协程内运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64313911/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com