使用平面图的科特林流无法调用收集中的方法
kotlin flow using flatmap cannot call method in collect
lifecycleScope.launch {
adapter?.getData()?.let {
val flowable = it.asFlow()
flowable.onEach {
doCompress(it)
}.flatMapConcat {
flow<Unit> {
updateProgressInMain()
}.flowOn(Dispachers.Main)
}.catch {
dismissLoading()
}.flowOn(Dispatchers.IO).collect {
Log.d("Collect", "" + Thread.currentThread())
}
}
}
如上代码,我无法在控制台打印 'Collect' 登录,但其他代码可以 运行 很好。但是,当我在 onEach 期间使用 'WithContext()' 而不是 flatMapConcat 来切换线程时,我可以打印日志。谁能描述一下发生了什么?
您生成了一个在 flatMapConcat
中永远不会发出的空 Flow,因此生成的 Flow 也永远不会发出任何东西。
你的代码对我来说不太有意义,但假设你想做的任务是,对于源 LiveData 作为 Flow 发出的每个项目:
- 将其传递给 IO 调度程序上的
doCompress()
。显然 doCompress()
没有 return 任何东西。
- 在压缩每个项目后在主线程上调用
updateProgressInMain()
。
然后不管失败与否都调用dismissLoading()
那么这个更简单的代码应该可以做到:
adapter?.getData()?.asFlow()?.onEach {
runCatching {
withContext(Dispatchers.IO) {
doCompress(it)
Log.d("Collect", "" + Thread.currentThread())
}
updateProgressInMain()
}
dismissLoading()
}?.launchIn(lifecycleScope)
lifecycleScope.launch {
adapter?.getData()?.let {
val flowable = it.asFlow()
flowable.onEach {
doCompress(it)
}.flatMapConcat {
flow<Unit> {
updateProgressInMain()
}.flowOn(Dispachers.Main)
}.catch {
dismissLoading()
}.flowOn(Dispatchers.IO).collect {
Log.d("Collect", "" + Thread.currentThread())
}
}
}
如上代码,我无法在控制台打印 'Collect' 登录,但其他代码可以 运行 很好。但是,当我在 onEach 期间使用 'WithContext()' 而不是 flatMapConcat 来切换线程时,我可以打印日志。谁能描述一下发生了什么?
您生成了一个在 flatMapConcat
中永远不会发出的空 Flow,因此生成的 Flow 也永远不会发出任何东西。
你的代码对我来说不太有意义,但假设你想做的任务是,对于源 LiveData 作为 Flow 发出的每个项目:
- 将其传递给 IO 调度程序上的
doCompress()
。显然doCompress()
没有 return 任何东西。 - 在压缩每个项目后在主线程上调用
updateProgressInMain()
。
然后不管失败与否都调用dismissLoading()
那么这个更简单的代码应该可以做到:
adapter?.getData()?.asFlow()?.onEach {
runCatching {
withContext(Dispatchers.IO) {
doCompress(it)
Log.d("Collect", "" + Thread.currentThread())
}
updateProgressInMain()
}
dismissLoading()
}?.launchIn(lifecycleScope)