Sobes.tech
Middle

Flow-də iş parçalarını necə keçirmək olar? Flow hansı iş parçasında işləyir?

sobes.tech Süni İntellekt

AI-dan cavab

Varsayılan olaraq, Flow işlədiyi axında işləyir. flowOn operatoru ilə axını dəyişə bilərsiniz.

import kotlinx.coroutines.CoroutineDispatcher // CoroutineDispatcher üçün
import kotlinx.coroutines.Dispatchers // Dispatchers üçün
import kotlinx.coroutines.flow.Flow // Flow üçün
import kotlinx.coroutines.flow.flow // flow üçün
import kotlinx.coroutines.flow.flowOn // flowOn üçün
import kotlinx.coroutines.runBlocking // runBlocking üçün

// Flow qaytaran nümunə funksiya
fun simpleFlow(): Flow<Int> = flow {
    logThread("Flow başladı") // flow builder-in işlədiyi thread-i qeyd et
    for (i in 1..3) {
        emit(i) // Dəyərləri yay
    }
}

fun main() = runBlocking {
    simpleFlow()
        .flowOn(Dispatchers.IO) // Upstream (yayımçılar) Dispatchers.IO-ə keçir
        .collect { value ->
            logThread("Yığılmış $value") // Dəyərlərin yığılma thread-i
        }
}

// Thread-i qeyd etmək üçün köməkçi funksiya
fun logThread(msg: String) {
    println("[$msg] [${Thread.currentThread().name}]")
}

flowOn operatoru, onunla əlaqəli operatorların əvvəlki icra olunduğu thread-ə təsir edir (o cümlədən flow builder). flowOn-dan sonra gələn operatorlar, flowOn arqumentində göstərilən thread-də işləyir. Əgər bir neçə flowOn ardıcıl olsa, hər biri özündən əvvəlki hissəyə təsir edir.

Bir neçə flowOn ilə nümunə:

import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.*
import kotlinx.coroutines.runBlocking

fun simpleFlowWithMultipleFlowOn(): Flow<String> = flow {
    logThread("Flow builder başladı") // Birinci `flowOn`-da işləyəcək
    emit("A")
    emit("B")
}.map {
    logThread("Mapping $it") // İkinci `flowOn`-da işləyəcək
    it.toLowerCase()
}.flowOn(Dispatchers.Default) // İkinci `flowOn` map və flow builder-ə təsir edir
.filter {
    logThread("Filtering $it") // `collect` çağırıldığı thread-də işləyir (adətən main/runBlocking)
    true
}.flowOn(Dispatchers.IO) // Birinci `flowOn` map və flow builder-ə təsir edir

fun main() = runBlocking {
    simpleFlowWithMultipleFlowOn().collect { value ->
        logThread("Yığılmış $value") // runBlocking (main) thread-də işləyir
    }
}

fun logThread(msg: String) {
    println("[$msg] [${Thread.currentThread().name}]")
}

Bu nümunədə:

  • flow builder və map Dispatchers.Default-də işləyəcək (son flowOn onların əvvəlindədir).
  • filter collect çağırıldığı thread-də işləyəcək, yəni runBlocking-in işlədiyi thread-də (adətən Main Android-də).

Əhəmiyyətli: flowOn aralıq buffer yaradır və "şəffaf" thread dəyişimi deyil.