/**
* Does some work and return true to denote success
* false to denote failure
*/
suspend fun doWork(): Boolean {
val processStatus = processWork()
return processStatus.filter { status ->
status == ProcessStatus.SUCCESS
|| status == ProcessStatus.FAILURE
}.map { filteredStatus ->
filteredStatus == ProcessStatus.SUCCESS
}.single()
}
/**
* Cretaes a channel in which different status will be offered
*/
suspend fun processWork(): Flow<ProcessStatus> {
val channel = BroadcastChannel(Channel.BUFFERED)
doThework(channel)
return channel.asFlow()
}
/**
* Does some work in background thread
*/
fun doThework(channel: BroadcastChannel) {
SomeSope.launch {
//Cretae a coroutine
channel.offer(ProcessStatus.Status1)
channel.offer(ProcessStatus.Status2)
channel.offer(ProcessStatus.Status3)
channel.offer(ProcessStatus.Status4)
channel.offer(rocessStatus.SUCCESS)
channel.close()
}
}
上面是我的代码的简化版本。
我想做的是,让
doWork()
等待所有值都被赋值,最后根据最后一个ProcessStatus.SUCCESS
或ProcessStatus.FAILURE
返回一个 bool(boolean) 值。现在,一旦
processWork()
返回流程,上面的代码就会发生什么。 doWork()
调用包括single()
在内的所有运算符,并且由于此工作仍在进行中,因此ProcessStatus.FAILURE或ProcessStatus.SUCCESS仍未执行,从而使其成为异常。如何使
doWork()
return语句等待并仅在流程完成时才返回?编辑1:
原因是,我必须使用该 channel 是因为,这是Android代码的一部分,而
channel.offer()
实际上并不是像上面的示例中那样的新协同例程,而是从Android BroadcastReceiver
调用的。由于流程很冷,我不希望用户离开Activity来停止任务的完成和通知。
最佳答案
看起来您可以使用toList方法在处理它们之前收集所有值:
suspend fun doWork(): Boolean {
val processStatus = processWork().toList()
return processStatus.filter { status ->
status == ProcessStatus.SUCCESS
|| status == ProcessStatus.FAILURE
}.map { filteredStatus ->
filteredStatus == ProcessStatus.SUCCESS
}.single()
}