Kotlin Flow와 병렬로 실행되는 장기 실행 작업

6976 단어 kotlinandroid
저는 Amit Shekhar , 개발자들이 고임금 기술직을 구하도록 돕는 멘토입니다.

이 블로그에서는 Android에서 Kotlin Flow와 병렬로 긴 작업을 실행하는 방법에 대해 알아봅니다.

이 문서는 원래 amitshekhar.me에 게시되었습니다.

구현 부분에 다음 프로젝트를 사용할 것입니다. 이 프로젝트는 단순성을 위해 기본 MVVM 아키텍처를 따릅니다. 프로젝트 자체에서 이 블로그에 언급된 구현을 위한 전체 코드를 찾을 수 있습니다.

GitHub 프로젝트: Learn Kotlin Flow

긴 작업을 병렬로 실행하려면 Kotlin Flow의 연산자zip가 필요합니다. 따라서 Kotlin Flow의 연산자zip가 무엇인지 이해해야 합니다.

Kotlin Flow의 zip 연산자는 무엇인가요?



Zip Operator는 지정된 함수를 통해 두 개의 흐름 컬렉션의 배출을 함께 결합하고 이 함수의 결과를 기반으로 각 조합에 대해 단일 항목을 배출하는 연산자입니다.



예제 코드로 마블 다이어그램을 이해해 봅시다.

val flowOne = flowOf(1, 2, 3)
val flowTwo = flowOf("A", "B", "C")

flowOne.zip(flowTwo) { intValue, stringValue ->
    "$intValue$stringValue"
}.collect {
    println(it)
}


출력은 다음과 같습니다.

1A
2B
3C


병렬로 장기 실행 작업



Android의 실제 사용 사례: 두 작업을 병렬로 실행하고 두 작업이 완료되면 단일 콜백에서 두 작업의 결과를 원할 때.

코드 구현을 살펴보겠습니다.

두 개의 장기 실행 작업이 있다고 가정합니다.

장기 실행 작업 1:

private fun doLongRunningTaskOne(): Flow<String> {
    return flow {
        // your code for doing a long running task
        // Added delay to simulate
        delay(5000)
        emit("One")
    }
}


장기 실행 작업 2:

private fun doLongRunningTaskTwo(): Flow<String> {
    return flow {
        // your code for doing a long running task
        // Added delay to simulate
        delay(5000)
        emit("Two")
    }
}


이제 zip 연산자를 사용하여:

fun startLongRunningTask() {
    viewModelScope.launch {
        doLongRunningTaskOne()
            .zip(doLongRunningTaskTwo()) { resultOne, resultTwo ->
                return@zip resultOne + resultTwo
            }
            .flowOn(Dispatchers.Default)
            .catch { e ->
                // handle exception
            }
            .collect {
                // result
            }
    }
}


출력은 다음과 같습니다.

OneTwo


여기에서는 zip 연산자를 사용했기 때문에 두 작업을 병렬로 실행하고 두 작업이 모두 완료되면 단일 콜백에서 두 작업의 결과를 제공합니다.

Zip 연산자를 사용하여 두 개의 흐름 컬렉션을 압축하면 두 작업이 병렬로 실행됩니다. 둘 다 완료되면 결과를 얻습니다. 이러한 방식으로 한 번에 두 흐름 수집의 결과를 얻습니다.

Kotlin Flow Zip 연산자의 장점:
  • 작업을 병렬로 실행합니다.
  • 모든 작업이 완료되면 작업 결과를 단일 콜백으로 반환합니다.

  • 이렇게 하면 작업을 병렬로 실행하기 위해 Kotlin에서 Flow의 Zip 연산자를 사용할 수 있습니다.

    지금은 그게 다입니다.

    감사

    Amit Shekhar

    다음에서 나와 연결할 수 있습니다.


  • GitHub
  • Facebook

  • Read all of my high-quality blogs here.

    좋은 웹페이지 즐겨찾기