如何解决当kotlin flow发出3次重复数据时,为什么在collection中只收到2次?
我对 collect 函数进行了基本测试以学习 kotlin 流程。
测试过程中发生了一些奇怪的事情,所以我留下了一个帖子
在流程块中,存在输入 3 个相同的发射值的情况。 然后将采集到的数据输出到日志中。
代码内容:
flow {
emit(1)
emit(1)
emit(2)
emit(2)
emit(2)
emit(2)
emit(3)
emit(3)
emit(4)
emit(4)
emit(4)
emit(5)
}.collect {
println(it)
}
结果:
1
1
2
2
3
4
4
5
代码执行 emit(2)
4 次和 emit(4)
3 次。
但是 collect
只包含 2
和 4
2 次。
你知道为什么会这样吗?
解决方法
如果日志是 LogCat(又名 Android),那是因为 LogCat 本身过滤了重复的行。 (也可能是 pidcat,但我很确定它是 LogCat)。这一切都基于所使用的标签。
例如,我有一个用于 Timber 的自定义 DebugTree,它将行号添加为标记名称的一部分。
如果我要这样做:
flow.emit(0)
flow.emit(0)
flow.emit(0)
flow.emit(0)
flow.emit(0)
我会看到
MyClass:1 D 0
MyClass:2 D 0
MyClass:3 D 0
MyClass:4 D 0
MyClass:5 D 0
如果我没有在标签中使用行号:
MyClass D 0
MyClass D 0
LogCat 发现标记和消息相同,因此删除重复项。
此外,这取决于“流”正在使用哪种实现。例如,如果它使用 StateFlow,则不会发出重复值。
@Test
fun `test flow`() = runBlockingTest {
val flow = MutableStateFlow(0)
val job = TestCoroutineScope().launch {
flow.collect { println(it) }
}
flow.emit(0)
flow.emit(0)
flow.emit(0)
flow.emit(0)
flow.emit(1)
flow.emit(2)
flow.emit(2)
flow.emit(3)
flow.emit(3)
job.cancel()
}
结果:
0
1
2
3
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。