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의 수명을 관리하세요.
Continue Learning
Kotlin 학습을 이어가세요
총 200개의 독립 HTML 학습 문서 중 하나입니다. 각 문서는 고유 URL과 canonical 메타데이터를 가집니다.