android - 如何使Kotlin流在执行Terminal操作符之前一直等到结束

标签 android kotlin kotlin-coroutines kotlin-flow

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

关于android - 如何使Kotlin流在执行Terminal操作符之前一直等到结束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62041666/

相关文章:

android - Visual Studio 无法识别模拟器 (AVD)

java - 如何在Java中制作自定义文件格式

java - android.view.ViewRoot$CalledFromWrongThreadException :

android - SomeApp "is never used"

kotlin - 我可以使用 kotlin "also"函数来缩短代码吗?

kotlin - 只要某种条件成立,Kotlin惯用的方式来处理集合

android - 即使没有变化时的流量发射值

android - 如何从协程范围返回值

java - 使用项目作为库,但需要更改 contentView

kotlin - 如何从不同的函数发出 Flow 值? Kotlin 协程