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