Sobes.tech
Middle

What is Flow and how does it work in Android?

sobes.tech AI

Answer from AI

Flow is an asynchronous data stream built on coroutines in Kotlin. It allows for sequential transmission of multiple values from producer to consumer.

How it works in Android:

  1. Producer: Generates data. This can be anything: a network request, reading from a database, handling UI events.
    // Example producer: Flow that emits numbers
    fun produceNumbers(): Flow<Int> = flow {
        for (i in 1..5) {
            delay(100) // Simulate long work
            emit(i) // Send value into the stream
        }
    }
    
  2. Consumer: Collects and processes data from the stream. Usually, these are Composable functions in Jetpack Compose or Observer in older approaches.
    // Example consumer: collecting data from Flow
    scope.launch { // Launch a coroutine for collection
        produceNumbers().collect { value ->
            // Process each received value
            println("Received: $value")
        }
    }
    
  3. Operators: Intermediate functions that transform or filter data in the stream. They work reactively, applied to each emitted value.
    // Example of using the map operator
    scope.launch {
        produceNumbers()
            .map { it * 2 } // Multiply each number by 2
            .collect { value ->
                println("Doubled: $value")
            }
    }
    

Key features of Flow:

  • Asynchronous: Works with coroutines, not blocking the main thread.
  • Cold stream: Flow starts execution only when there is a subscriber (collect). Without it, the producer does not run.
  • Sequential: Values are emitted and processed sequentially within a single stream.
  • Backpressure: Flow handles backpressure by default. If the consumer is slower than the producer, emission is paused to avoid overwhelming the consumer.
  • Operators: Provides a rich set of operators (map, filter, reduce, combine, stateIn, shareIn, etc.) for data transformation and processing.
  • Integration: Easily integrates with other Android components (ViewModel, Room, DataStore, Lifecycle). StateFlow and SharedFlow are specialized types of Flow, often used in UI (ViewModel) to represent states and events.

StateFlow vs SharedFlow:

Characteristic StateFlow SharedFlow
Type State-holding (has an initial value) General-purpose cold/hot (configurable)
Initial value Mandatory Optional
Re-emission for new subscribers Emits the last value upon subscription Depends on the replay parameter
Backpressure support No (works with the last value) Yes
Main use UI state representation Emission of events, general data stream