【发布时间】:2020-11-05 19:45:53
【问题描述】:
我正在viewLifecycleOwner 上收集流量。它在Dispatchers.Default 上流动,但收集本身在Dispatchers.Main 上进行。
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
viewLifecycleOwner.lifecycleScope.launch {
flow.flowOn(Default).collect {
requireContext()
}
}
}
在一次情况下,我发现IllegalStateException 声明该片段未附加。
IllegalStateException:片段测试未附加到上下文。
我假设在分离片段之前会取消流的收集。
协程如何在分离的片段上恢复?
【问题讨论】:
-
我对@987654326@不熟悉。由于
lifecycleScope是协程作用域,它会在组件销毁时被销毁。我们可以在内部范围集合中检查if(parentScope.isActive)吗? -
@ADM 我还不知道复制。我会为将来添加更多日志记录,但我不知道它什么时候会再次发生......
-
据我了解,
IllegalStateException表示即使生命周期范围被破坏,内部范围仍会继续执行,这就是我建议if(parentScope.isActive)的原因。我们不能简单地将Dispatcher传递给viewLifecycleOwner.lifecycleScope.launch或者Dispatcher,IO并以这种方式直接收集流量,这样只会有一个范围。这适用于 Flow 吗? -
@ADM 收集需要在
Main上恢复。流本身是一个依赖项,之前也设置了flowOn。IllegalStateException表示生命周期在onDetach之后。是否有可能在片段被销毁之前调度了收集器,因此 Runnable 在Main上排队?我认为isActive可能是需要观察的重要信息。遗憾的是,我刚刚收到通知,用户没有观察到崩溃。所以可能与应用更新或进程关闭有关。
标签: android kotlin android-fragments kotlin-coroutines kotlin-flow