/**
* 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.SUCCESSProcessStatus.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()
}

10-04 12:22