Home API의 Kotlin 버전은 변환, 필터링, 매핑, 컬렉션 간의 변환 등을 비롯한 비동기 데이터 스트림을 처리하는 강력한 기능을 제공하는 Kotlin 언어의 기능인 흐름을 사용합니다.
코루틴은 흐름과 밀접하게 연결되어 있으며 비동기 코드를 작성하기 위한 우아한 추상화를 제공하고 개발자가 콜백 루틴을 명시적으로 작성하지 않아도 됩니다. Flow는 코루틴과 함께 작동하여 함수나 스레드가 완료될 때까지 기다리지 않고도 코루틴에서 비동기식으로 데이터를 가져오는 방법으로 사용됩니다.
데이터는 수집이라는 프로세스에서 소비자가 흐름에서 가져옵니다.
Kotlin Flow에는 이 목적으로 사용할 수 있는 collect()
함수가 있습니다. 수집 중에 흐름에서 발생하는 상황은 흐름 유형에 따라 다릅니다.
Kotlin 흐름 (Flow<T>
)은 기본적으로 콜드입니다. 즉, 흐름 빌더 코드는 collect()
이 호출될 때만 데이터를 생성합니다. 반면 핫 흐름은 데이터가 즉시 생성되어 데이터가 소비될 때마다 메모리에 버퍼링됩니다(큐와 같은 방식). 메모리에 데이터를 유지하므로 핫 플로는 상태 저장이라고 간주됩니다.
shareIn
연산자를 사용하여 흐름을 콜드에서 핫으로 변환할 수 있습니다(shareIn
을 사용하여 콜드 흐름을 핫 흐름으로 만들기 참고). SharedFlow
또는 StateFlow
를 사용하여 콜드 흐름을 핫 흐름으로 전환할 수도 있습니다.
샘플 앱에서 흐름을 사용하는 방법
샘플 앱은 Home API의 흐름에 연결된 Jetpack Compose의 뷰 모델을 사용합니다. 많은 샘플 앱 UI 요소는 상태에 따라 작동하지만 상호작용할 수 있습니다. 또한 샘플 앱은 실시간 사용자 환경을 위해 기기의 상태를 UI의 '낙관적' 상태와 혼합합니다. 낙관적이라는 용어는 앱이 특정 작업이 성공했다고 가정하고 확인을 기다리지 않고 예상 결과를 반영하도록 UI를 즉시 업데이트함을 의미합니다. 작업이 실패한 것으로 확인되면 UI가 업데이트되어 실제 상태를 반영합니다.
샘플 앱에서는 뷰 모델의 각 레이어 (구조, 방, 기기)에 대해 흐름이 생성됩니다. 예를 들어 GlobalViewModel.kt
에 다음 호출이 있는 구조의 경우
fun getStructuresState(): StateFlow<List<StructureModel>?> =
homeClient
.structures()
.map { structures -> structures.map { StructureModel(it.name, it) }.sortedBy { it.name } }
.handleErrors()
.flowOn(Dispatchers.IO)
.stateIn(scope = viewModelScope, started = SharingStarted.WhileSubscribed(), null)
emitAll()
는 지정된 흐름에서 모든 값을 수집하여 수집기에 내보냅니다. stateIn()
는 업스트림 흐름의 단일 실행 인스턴스에서 가장 최근에 내보낸 값을 여러 다운스트림 구독자와 공유합니다. 자세한 내용은 kotlinx.coroutines.flow
참조를 확인하세요.
Jetpack Compose
흐름 객체를 로컬 메모리에 저장하고 종료되지 않도록 하려면 Kotlin remember
API를 사용하세요.
Jetpack Compose에서 collectAsStateWithLifecycle()
와 함께 이를 사용하면 Jetpack은 해당 상태를 보여주는 애플리케이션 UI가 실제로 포그라운드에 있는지 여부에 따라 흐름에서 구독 및 구독 취소를 자동으로 관리합니다.
샘플 앱에서 간단히 호출하면 됩니다. 앞에서 표시된 getStructuresState()
함수를 사용합니다.
val structuresList by
remember(globalViewModel) { globalViewModel.getStructuresState() }.collectAsStateWithLifecycle()
이제 구조의 상태 (예: name
)가 변경되면 이를 사용하는 컴포저블 함수가 업데이트된 상태를 자동으로 반영합니다.
샘플 앱에서는 HomeActivityContent()
함수입니다.
리소스
Kotlin, 흐름, 코루틴, Jetpack Compose에 관한 자세한 내용은 다음 리소스를 참고하세요.
- Kotlin으로 Android 앱 개발
- Android용 Kotlin 알아보기
- Android의 Kotlin 코루틴 다음 Codelab이 유용할 수 있습니다.
- Android의 Kotlin 흐름, 특히 StateFlow를 사용합니다.
- 상태 및 Jetpack Compose, 특히
collectAsStateWithLifecycle()
함수 이 함수는 해당 상태를 보여주는 UI가 실제로 포그라운드에 있는지 여부에 따라 흐름의 구독 및 구독 취소를 자동으로 관리합니다. - Automation API를 사용하는 경우 Kotlin 형식이 안전한 빌더에 관해 읽어보면 Automation DSL의 작동 방식을 이해하는 데 도움이 됩니다.