Kotlin

Kotlin callbackFlow callback listener의 데이터를 Coroutines flow로 보내기

Darane 2021. 9. 13. 10:14

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) }
        }
    }
반응형