PHpullh
학습 라이브러리/Kotlin/callbackFlow로 콜백 래핑

KOTLIN · 비동기

callbackFlow로 콜백 래핑

callbackFlow로 콜백 기반 API를 Flow로 변환합니다. 리스너 등록/해제를 안전하게 관리합니다.

비동기고급callbackFlowcallback-wrapperflowawaitClose

핵심 설명

callbackFlow로 콜백 기반 API를 Flow로 변환합니다. 리스너 등록/해제를 안전하게 관리합니다.

Kotlin code

import kotlinx.coroutines.*
import kotlinx.coroutines.channels.*
import kotlinx.coroutines.flow.*

// 콜백 기반 API 시뮬레이션
interface LocationListener {
    fun onLocationChanged(lat: Double, lng: Double)
    fun onError(message: String)
}

class LocationManager {
    private var listener: LocationListener? = null
    fun register(l: LocationListener) { listener = l; println("리스너 등록") }
    fun unregister() { listener = null; println("리스너 해제") }
    fun simulateUpdates() {
        listener?.onLocationChanged(37.5665, 126.9780)
        listener?.onLocationChanged(37.5670, 126.9785)
    }
}

data class Location(val lat: Double, val lng: Double)

fun LocationManager.locationFlow(): Flow<Location> = callbackFlow {
    val listener = object : LocationListener {
        override fun onLocationChanged(lat: Double, lng: Double) {
            trySend(Location(lat, lng))
        }
        override fun onError(message: String) {
            close(Exception(message))
        }
    }
    register(listener)
    awaitClose { unregister() }
}

fun main() = runBlocking {
    val manager = LocationManager()
    val job = launch {
        manager.locationFlow().collect { println("위치: $it") }
    }
    delay(100)
    manager.simulateUpdates()
    delay(100)
    job.cancel()
}

학습 팁

awaitClose 블록에서 리스너를 해제하면 Flow가 취소될 때 자동으로 정리됩니다. 리소스 누수를 방지하는 핵심 패턴입니다.

주의할 점

callbackFlow 내에서 awaitClose를 생략하면 채널이 즉시 닫힙니다. 반드시 awaitClose로 Flow의 수명을 관리하세요.

자주 묻는 질문

callbackFlow로 콜백 래핑란 무엇인가요?

callbackFlow 로 콜백 기반 API를 Flow로 변환합니다. 리스너 등록/해제를 안전하게 관리합니다.

callbackFlow로 콜백 래핑 학습 시 주의할 점은 무엇인가요?

callbackFlow 내에서 awaitClose 를 생략하면 채널이 즉시 닫힙니다. 반드시 awaitClose 로 Flow의 수명을 관리하세요.