我有一个库,它通过从不同来源读取数据产生值,并将它们提供给库用户可以从中收集的流
为此,我使用此代码
private val dataChannel = BroadcastChannel<Reading>(10)
val dataFlow get() = dataChannel.asFlow()
//this may be triggered by a 5 different threads
fun newReading(type:String, value:Float, time:Date, level:Int) {
dataChannel.offer(Reading(type,value,time,Level.fromValue(level))
}
用户可以做这样的事情来获取数据
lastJob?.cancel()
lastJob = launch {
lib.dataFlow.flowOn(Dispatchers.Default).collect { reading ->
val result = processReading(reading)
withContext(Dispatchers.IO) {
Toast.makeText(application.applicationContext, result,Toast.LENGTH_LONG).show()
}
}
}
这按预期工作,当用户启动作业时,我的图书馆可能会继续发送数据并且图书馆的用户将继续接收它们
但是,如果用户取消lastJob
并在几秒钟后再次启动它,他们将丢失我的库在这两次之间接收到的数据
是否可以dataChannel
存储在该时间跨度内接收到的所有读数offer
(直到其构造函数中设置的缓冲级别 10)以及何时dataFlow
再次激活以同时发出这些值?