Ответ
Flow выполняется в том же диспатчере, в котором был вызван терминальный оператор (например, collect). Промежуточные операторы (map, filter, single) не влияют на контекст выполнения.
Пример:
flow {
emit(1)
emit(2)
}
.map { it * 2 } // выполнится в том же контексте, что и collect
.filter { it > 2 } // аналогично
.single() // тоже
.collect { value ->
println(value) // зависит от диспатчера collect-а
}
Если нужно изменить контекст, используйте flowOn:
flow { ... }
.flowOn(Dispatchers.IO) // меняет контекст для upstream
.collect { ... } // выполняется в контексте collect-а