2
/**
* 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です。

現在、上記のコードで起こっていることは、processWork()がフローを返すとすぐです。doWork()and 以降を含むすべての演算子を呼び出しますがsingle()、作業はまだ進行中です ProcessStatus.FAILURE または ProcessStatus.SUCCESS がまだ発行されていないため、例外が発生します。

doWork()return ステートメントを待機させ、フローが完了したときにのみ返すにはどうすればよいですか?


編集1:

理由は、これは Android コードの一部であり、channel.offer()実際には上記の例のような新しいコルーチンではなく、 Android から呼び出されているためBroadcastReceiverです。

フローはコールドであるため、ユーザーがアクティビティを離れて、タスクの完了と通知が停止されることを望んでいませんでした。

4

1 に答える 1