tryEmit doesn't attempt to emit a value after first subscriber joined and returns false.
Setting replay or extraBufferCapacity > 0 or replacing tryEmit by emit resolves the issue
@Test
fun tryEmitExample() = runBlocking {
val sharedFlow = MutableSharedFlow<Long>()
val asyncReceiver = async(){
delay(300)
sharedFlow.collect{
println("Received on 1 $it")
}
println("Done")
}
repeat(4) {
delay(100)
val res = sharedFlow.tryEmit(System.currentTimeMillis())
println("Emitted ${System.currentTimeMillis()} Subscribers: ${sharedFlow.subscriptionCount.value} try: $res")
}
asyncReceiver.cancel()
}
Emitted 1605303026489 Subscribers: 0 try: true
Emitted 1605303026592 Subscribers: 0 try: true
Emitted 1605303026693 Subscribers: 1 try: false
Emitted 1605303026799 Subscribers: 1 try: false
@Test
fun emitExample() = runBlocking {
val sharedFlow = MutableSharedFlow<Long>()
val asyncReceiver = async(){
delay(300)
sharedFlow.collect{
println("Received on 1 $it")
}
println("Done")
}
repeat(4) {
delay(100)
sharedFlow.emit(System.currentTimeMillis())
println("Emitted ${System.currentTimeMillis()} Subscribers: ${sharedFlow.subscriptionCount.value}")
}
asyncReceiver.cancel()
}
Emitted 1605303080955 Subscribers: 0
Emitted 1605303081061 Subscribers: 0
Received on 1 1605303081162
Emitted 1605303081166 Subscribers: 1
Received on 1 1605303081267
Emitted 1605303081267 Subscribers: 1
tryEmitdoesn't attempt to emit a value after first subscriber joined and returnsfalse.Setting
replayorextraBufferCapacity> 0 or replacingtryEmitbyemitresolves the issue