네트워크_상태_변경_문제_해결 - boostcampwm-2024/and04-Nature-Album GitHub Wiki
💥 네트워크 상태 변경 문제 트러블 슈팅
문제 정의
NetworkManager_FLP com.sec.location.nsflp2 I updateLostDataState, type=MOBILE_DATA
2024-11-28 14:55:00.046 4742-4835 NetworkManager_FLP com.sec.location.nsflp2 I Success to add new network info by lostDataState, Service=0 / Network=LTE(band=5, ch=2500) / MobileData=false, roaming=false / WIFI=false, conn=false / BT=false, conn=false
2024-11-28 14:55:00.051 3812-3974 NetworkManager com.and04.naturealbum D Network lost: 226
2024-11-28 14:55:00.052 3812-3974 NetworkManager com.and04.naturealbum D updateNetworkState - Previous: 1, New: 1, Capabilities: [ Transports: CELLULAR Capabilities: SUPL&RCS&INTERNET&NOT_RESTRICTED&TRUSTED&NOT_VPN&VALIDATED&NOT_ROAMING&FOREGROUND&NOT_CONGESTED&NOT_SUSPENDED&NOT_VCN_MANAGED LinkUpBandwidth>=2340Kbps LinkDnBandwidth>=20984Kbps Specifier: <TelephonyNetworkSpecifier [mSubId = 1]> SubscriptionIds: {1} UnderlyingNetworks: Null]
2024-11-28 14:55:00.052 3812-3974 NetworkManager com.and04.naturealbum D Network state remains unchanged
2024-11-28 14:55:12.196 4742-4835 NetworkManager_FLP com.sec.location.nsflp2 W updateServiceStateChanged, serviceState=0 / isRegistered=true / channel=2500 / networkTypeName=LTE / nr=false
2024-11-28 14:55:12.197 4742-4835 NetworkManager_FLP com.sec.location.nsflp2 W updateServiceStateChanged, serviceState=0 / isRegistered=true / channel=2500 / networkTypeName=LTE / nr=false
- 네트워크 상태 변경 시 UI가 정확히 갱신되지 않는 문제가 발생하였다.
- 특히, 모바일 데이터를 비활성화하거나 Wi-Fi를 전환할 때, UI가 이전 네트워크 상태를 유지하거나 잘못된 상태를 반영하였다.
- 로그 분석 결과, 네트워크가 끊겼음에도 불구하고 상태 값이
DISCONNECTED
로 업데이트되지 않거나,onLost
콜백이 호출된 이후에도Capabilities
가 이전 상태를 유지하는 경우가 관찰되었다.
문제 해결 방법
onLost
콜백에서 네트워크 상태를 명시적으로DISCONNECTED
로 설정한다.activeNetwork
와Capabilities
를 동시 검증하여 네트워크 상태를 일관되게 반영한다.- 상태 전환 조건을 명확히 하여, 상태가 변경될 때만
_networkState
값을 갱신한다. - 로그를 추가하여 상태 전환 과정을 확인할 수 있도록 한다.
문제 해결 진행
1. 초기 증상 확인 및 로그 분석
-
네트워크 상태를 전환할 때
onLost
콜백이 호출되었으나,_networkState
값이 변경되지 않는 경우가 다수 발생하였다. -
특히,
Capabilities
가 이전 상태를 유지하여 네트워크가 여전히 연결된 것으로 잘못 판단되었다. -
예시 로그:
updateNetworkState - **Previous: 1, New: 1**, Capabilities: [이전 상태 정보] Network state remains unchanged
-
이를 통해 상태 업데이트 로직이 정확하지 않다는 것을 파악하였다.
onLost
콜백 수정
2. -
onLost
콜백에서 명시적으로_networkState.value
를DISCONNECTED
로 설정하였다. -
수정 전: 상태 변경 여부를
Capabilities
에만 의존하여, 네트워크가 실제로 끊어졌을 때 상태가 반영되지 않았다. -
수정 후: 네트워크가 끊기면
Capabilities
상태와 관계없이 즉시DISCONNECTED
로 전환하도록 하였다.override fun onLost(network: android.net.Network) { super.onLost(network) Log.d("NetworkManager", "Network lost: $network") // 전: updateNetworkState() _networkState.value = NetworkState.DISCONNECTED }
updateNetworkState
로직 개선
3. -
activeNetwork
와Capabilities
를 동시에 확인하여 상태를 정확히 판단하도록 수정하였다. -
activeNetwork
가null
이거나Capabilities
가null
인 경우, 네트워크 상태를DISCONNECTED
로 설정하였다. -
수정된 로직:
private fun updateNetworkState() { val currentNetwork = connectivityManager.activeNetwork val caps = connectivityManager.getNetworkCapabilities(currentNetwork) val newState = when { currentNetwork == null || caps == null -> NetworkState.DISCONNECTED caps.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) -> NetworkState.CONNECTED_WIFI caps.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) -> NetworkState.CONNECTED_DATA else -> NetworkState.DISCONNECTED } if (_networkState.value != newState) { Log.d("NetworkManager", "Network state updated to $newState") _networkState.value = newState } else { Log.d("NetworkManager", "Network state remains unchanged") } }
4. 네트워크 상태 변경 시나리오 테스트
-
다음 네트워크 상태 변경 시나리오를 테스트하였다:
- Wi-Fi 연결 → Wi-Fi 비활성화 → 모바일 데이터 활성화
- 모바일 데이터 활성화 → 모바일 데이터 비활성화 → Wi-Fi 연결
- 네트워크 모두 비활성화 → Wi-Fi 연결
- 네트워크 모두 비활성화 → 모바일 데이터 활성화
-
각 상태 전환에서 로그를 통해 상태 값이 적절히 갱신되는 것을 확인하였다.
Network state updated to DISCONNECTED Network state updated to CONNECTED_WIFI
결과
- 네트워크 상태 변경이 정확히 반영되도록 로직을 개선하였다.
- 모든 테스트 시나리오를 성공적으로 통과하여 Wi-Fi와 모바일 데이터 전환 시 UI 갱신이 정상적으로 이루어졌다.
- 문제의 주요 원인은
onLost
에서 명시적으로 상태를 반영하지 않았던 점과Capabilities
갱신 과정에서 발생한 불일치였다. - 개선된
NetworkManager
는 네트워크 상태를 정확히 반영하며, 향후 디버깅이 용이하도록 자세한 로그를 추가하였다.
이번 트러블 슈팅 과정을 통해 비동기적으로 작동하는 네트워크 상태 갱신 로직의 중요성과 명시적 상태 관리의 필요성을 배울 수 있었다.