Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Expert patterns for Kotlin Coroutines and Flow, covering structured concurrency, error handling, and testing.
| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-05 | ✗→✓ | ▲ Improved | 22% | 0% |
| case-09 | ✗→✓ | ▲ Improved | 13% | 0% |
| case-02 | ✓→✓ | = Same ✓ | -17% | 0% |
| case-03 | ✓→✓ | = Same ✓ | 10% | 0% |
| case-04 | ✓→✓ | = Same ✓ | -9% | 0% |
A guide to mastering asynchronous programming with Kotlin Coroutines. Covers advanced topics like structured concurrency, Flow transformations, exception handling, and testing strategies.
Flow.Always launch coroutines within a defined CoroutineScope. Use coroutineScope or supervisorScope to group concurrent tasks.
kotlinsuspend fun loadDashboardData(): DashboardData = coroutineScope { val userDeferred = async { userRepo.getUser() } val settingsDeferred = async { settingsRepo.getSettings() } DashboardData( user = userDeferred.await(), settings = settingsDeferred.await() ) }
Use CoroutineExceptionHandler for top-level scopes, but rely on try-catch within suspending functions for granular control.
kotlinval handler = CoroutineExceptionHandler { _, exception -> println("Caught $exception") } viewModelScope.launch(handler) { try { riskyOperation() } catch (e: IOException) { // Handle network error specifically } }
Use StateFlow for state that needs to be retained, and SharedFlow for events.
kotlin// Cold Flow (Lazy) val searchResults: Flow<List<Item>> = searchQuery .debounce(300) .flatMapLatest { query -> searchRepo.search(query) } .flowOn(Dispatchers.IO) // Hot Flow (State) val uiState: StateFlow<UiState> = _uiState.asStateFlow()
kotlinsuspend fun fetchDataWithErrorHandling() = supervisorScope { val task1 = async { try { api.fetchA() } catch (e: Exception) { null } } val task2 = async { api.fetchB() } // If task2 fails, task1 is NOT cancelled because of supervisorScope val result1 = task1.await() val result2 = task2.await() // May throw }
Dispatchers.IO for blocking I/O operations.ViewModel.onCleared).TestScope and runTest for unit testing coroutines.GlobalScope. It breaks structured concurrency and can lead to leaks.CancellationException unless you rethrow it.Problem: Coroutine test hangs or fails unpredictably. Solution: Ensure you are using runTest and injecting TestDispatcher into your classes so you can control virtual time.
Other measured skills in the registry, with their headline benchmark lift.