DEV Community

myougaTheAxo
myougaTheAxo

Posted on

Coroutine Channels: Building Event Bus and Message Queues

Kotlin Channels enable efficient communication between coroutines. They're perfect for building event buses and message queues.

Basic Channel Communication

@Composable
fun ChannelExample() {
    val channel = remember { Channel<String>(capacity = Channel.BUFFERED) }

    LaunchedEffect(Unit) {
        launch {
            repeat(5) { index ->
                channel.send("Message $index")
                delay(1000)
            }
        }

        launch {
            for (message in channel) {
                println("Received: $message")
            }
        }
    }
}
Enter fullscreen mode Exit fullscreen mode

Event Bus Implementation

class EventBus {
    private val channel = Channel<Event>(Channel.BUFFERED)

    suspend fun publish(event: Event) {
        channel.send(event)
    }

    fun subscribe(): ReceiveChannel<Event> = channel
}

sealed class Event {
    data class UserLogin(val userId: String) : Event()
    data class DataUpdated(val data: String) : Event()
}

@Composable
fun EventBusScreen(eventBus: EventBus = remember { EventBus() }) {
    LaunchedEffect(Unit) {
        launch {
            for (event in eventBus.subscribe()) {
                when (event) {
                    is Event.UserLogin -> println("User logged in: ${event.userId}")
                    is Event.DataUpdated -> println("Data: ${event.data}")
                }
            }
        }

        eventBus.publish(Event.UserLogin("user123"))
    }
}
Enter fullscreen mode Exit fullscreen mode

SharedFlow for Multiple Subscribers

For multiple consumers:

class EventManager {
    private val _events = MutableSharedFlow<Event>()
    val events = _events.asSharedFlow()

    suspend fun emit(event: Event) {
        _events.emit(event)
    }
}
Enter fullscreen mode Exit fullscreen mode

Channels and Flows provide powerful concurrent programming patterns.


8 Android app templates available on Gumroad

Top comments (0)