1

我正在收集流量viewLifecycleOwner。它继续流动Dispatchers.Default,但收集本身发生在Dispatchers.Main.

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    viewLifecycleOwner.lifecycleScope.launch {
        flow.flowOn(Default).collect {
            requireContext()
        }
    }
}

在一个场合IllegalStateException,我发现该片段未附加。

IllegalStateException:片段测试未附加到上下文。

我假设在分离片段之前会取消流的收集。

协程如何在分离的片段上恢复?

4

1 回答 1

2

首先,值得注意的是flowOn更改上游上下文map以防在. 因此,它不会影响终端函数的上下文,例如. 它在kotlin 文档中有所说明。所以,如果你想改变终端的上下文,你应该从外部块改变它,我的意思是构建器函数。filterflowOncollectcollectlaunch

接下来,要避免以安全的方式使用,而不是IllegalStateException确保已附加片段。毫无疑问,当片段被销毁时,所有启动的协程都应该终止,但在某些情况下,线程中可能存在导致此问题的竞争条件。contextrequireContext()viewLifecycleOwner.lifecycleScope

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)

    viewLifecycleOwner.lifecycleScope.launch(Main/Default/WhateverContextYouWant) {
        flow.collect {
            context?.let { }
        }
    }
}
于 2020-11-02T16:32:32.853 回答