Android에서 callback listener를 코루틴(Coroutines) flow로 보내는 방법을 포스팅합니다.
Android에서 이벤트가 호출될 때 listener를 통해 응답을 처리합니다. Flow를 이용하여 데이터 흐름을 만드려고할 때 listener를 통해 받은 값을 flow로 보낼 수 없습니다.
Flow와 listener 내부의 scope가 다르기 때문에 listener내부에서 emit을 사용하여 바로 데이터를 보낼 수 없습니다.
(Suspension functions can be called only within coroutine body)
이러한 경우 callbackflow를 사용하여 listener 내부 값을 flow로 보낼 수 있습니다. listener 내부에서 offer함수를 호출하여 데이터를 보내면 됩니다.
Android의 네트워크 연결 정보를 가져오는 callbackFlow 예제로 확인해보겠습니다.
class NetworkHelper @Inject constructor(context: Context) {
private val cm = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
val networkStatus = callbackFlow<NetworkResult> {
val networkStatusCallback = object : ConnectivityManager.NetworkCallback() {
override fun onUnavailable() {
offer(NetworkResult.Unavailable)
}
override fun onAvailable(network: Network) {
offer(NetworkResult.Available)
}
override fun onLost(network: Network) {
offer(NetworkResult.Lost)
}
}
val networkRequest = NetworkRequest.Builder()
.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
.build()
cm.registerNetworkCallback(networkRequest, networkStatusCallback)
awaitClose { cm.unregisterNetworkCallback(networkStatusCallback) }
}
}
반응형
'Kotlin' 카테고리의 다른 글
[Kotlin] StateFlow subscriptionCount 구독자 수 확인 (0) | 2021.10.15 |
---|---|
[Kotlin] Type checks와 형변환(casts) (0) | 2021.10.06 |
[Kotlin] Cold Stream(flow), Hot Stream(flow) 차이점 (0) | 2021.10.05 |
[Kotlin] 기본적인 구문 - 2 (0) | 2021.09.07 |
[Kotlin] 기본적인 구문 - 1 (0) | 2021.09.03 |
Kotlin companion object(동반 객체) (0) | 2020.05.20 |