본문 바로가기

CSE/Android

DefaultNetworkCallback, Listen 타입과 Request 타입 Network Callback 이해하기

반응형

Android의 네트워크 시스템은 애플리케이션이 네트워크 상태를 감지하고 관리하는 데 사용할 수 있는 강력한 도구를 제공합니다. 오늘은 이 중 DefaultNetworkCallback, Listen 타입 NetworkCallback, 그리고 Request 타입 NetworkCallback에 대해 알아보겠습니다.

ConnectivityManager에는 네트워크 변화를 감지하기 위한 콜백 함수를 등록하는 대표적인 방법 세 가지 있습니다. 하나는 registerDefaultNetworkCallback, 다른 두가지는 registerNetworkCallbackrequestNetwork입니다.

registerDefaultNetworkCallback는 DefaultNetwork에 대한 변화를 감지합니다. Default Network란, 시스템이 현재 인터넷 트래픽을 보낼 때 선택하는 네트워크를 말합니다. 따라서, 이 콜백은 Default Network가 바뀌거나 없어질 때 호출됩니다.

ConnectivityManager connectivityManager = (ConnectivityManager) 
    context.getSystemService(Context.CONNECTIVITY_SERVICE);

connectivityManager.registerDefaultNetworkCallback(
    new ConnectivityManager.NetworkCallback() {
        @Override
        public void onAvailable(Network network) {
            // Default Network가 사용 가능해질 때 호출
        }

        @Override
        public void onLost(Network network) {
            // Default Network가 더 이상 사용 불가능해질 때 호출
        }
    }
);

네트워크 요청과 관련하여 Android의 ConnectivityManager는 두 가지 유형의 NetworkCallback을 제공합니다: Request 타입과 Listen 타입입니다. 이에 대한 더 자세한 비교는 다음과 같습니다:

Request 타입은 requestNetwork()를 호출하면, Android는 해당 NetworkRequest를 만족시키려고 시도합니다. 이는 기본적으로 "이러한 기능을 가진 네트워크가 필요합니다"라는 의미입니다. Android는 그런 네트워크가 현재 사용 가능하지 않은 경우, 요청을 충족시키는 네트워크로 전환하거나 해당 네트워크를 활성화하려고 시도합니다.

NetworkRequest request = new NetworkRequest.Builder()
    .addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
    .build();

connectivityManager.requestNetwork(request, networkCallback);

이 메서드는 애플리케이션에서 NetworkRequest에 정의된 기능을 가진 네트워크 없이는 작업을 수행할 수 없는 경우 사용해야 합니다.

간단히 말해서, Request 타입 NetworkCallback은 활성 요청이며, Android는 귀하의 요청을 만족시키기 위해 행동을 취합니다.

Listen 타입은 NetworkRequest를 통해 필요한 특성을 명시하면 "이러한 성격의 네트워크가 사용 가능해지면 알려주세요"라고 말하는 것입니다. 하지만 requestNetwork()와 달리, 이 메서드는 네트워크 전환을 유발하거나 NetworkRequest를 만족시키려는 시도를 하지 않습니다

NetworkRequest request = new NetworkRequest.Builder()
    .addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
    .build();

connectivityManager.registerNetworkCallback(request, networkCallback);

이 메서드는 애플리케이션이 사용 가능한 네트워크를 대체 사용할 수 있거나, 흥미로운 네트워크가 사용 가능해질 때 알고 싶을 때 사용해야 합니다.

App 이 너무 많은 callback을 등록하여 성능에 문제를 야기할 수 있기 때문에 시스템은 각 앱별로 동시에 등록가능한 콜백을 100개로 제한하고 있고 이는 타입에 상관없이 모두 공통입니다(ConnectivityManager 콜백 그리고 ConnectivityDiagnosticsManager#registerConnectivityDiagnosticsCallback 등도 모두 공유합니다)
100개를 초과하면 exception이 발생하므로 활용용도가 다한 callback은 항상 unregisterNetworkCallback(android.net.ConnectivityManager.NetworkCallback) 하여 사용하시기 바랍니다.

이러한 이해를 바탕으로 Android 애플리케이션에서 네트워크 상태를 더 효과적으로 관리할 수 있을 것입니다. 다양한 네트워크 상황에서도 사용자에게 최상의 경험을 제공하는 애플리케이션을 만드는 데 이 포스트가 도움이 되길 바랍니다.

반응형