안드로이드 — 인터넷 연결 끊김 감지하기(Android: Intercept on no internet connection)
이 글은 Medium 블로거 Elye님의 https://medium.com/@elye.project/android-intercept-on-no-internet-connection-acb91d305357 글을 번역하고 참고하여 작성한 글입니다.
이번 글에서는 OkHttp
라이브러리 사용 시 어떻게 인터넷 연결 끊김을 판단하는지, 간단하게 코드를 통해 알아보겠습니다.
🧰 OkHttpClient에서 interceptor 설정하기
안드로이드 스튜디오에서 네트워크 통신을 사용할 때 보통 OkHttpClient
를 주로 사용하여 상태나 데이터를 확인 할 수 있습니다.
OkHttp
는 OkHttpClient
의 인터셉터 플러그인을 통해서 네트워크 통신을 인터셉트 하는 방법을 제공해주고 있는데 여기서 우리는 단지 인터셉트하는 기능을 가진 메소드를 만들고 네트워크 끊김을 감지하도록 하면 됩니다.
NoConnectionInterceptor
클래스를 만들어서 OkHttpClient
에 인터셉트로 추가한 후 네트워크 끊김을 감지해보겠습니다.
원문의 블로거분은
Dagger2
를 사용하셨으나 저는Koin
을 사용하여OkHttpClient
를 만들어 사용하였습니다.
🛠 커스텀 NoConnectionInterceptor 만들기
이제 커스텀 NoConnectionInterceptor
를 만들어보겠습니다. 우선 WIFI와 데이터 연결을 탐지하기 위해서 AndroidManifest.xml
파일에 다음과 같이 퍼미션을 주도록 합니다.
<user-permission android:name"android.permission.ACCESS_NETWORK_STATE"/>
이제 네트워크 상태를 체크할 수 있습니다.
첫 번째로 네트워크 정보 객체를 가지고 있는 context
에서 connectionManager
를 가져옵니다.
만약 안드로이드 버전이 마시멜로우 이전이라면 connectivity
안의 activeNetworkInfo
를 통해서 네트워크 정보를 가져옵니다.
마시멜로우 이후의 버전에서는 connectivityManager
의 activeNetwork
에서 네트워크 정보를 가져올 수 있습니다.
그 다음 아래와 같이 결합하여 사용할 수 있습니다.
인터넷 연결이 끊겼음을 알리기 위해 커스텀 Exception
클래스를 만들어 주었습니다.
✨ 전체 코드
이제 사용해보겠습니다. NoConnectionInterceptor
클래스의 전체 코드는 다음과 같습니다. Interceptor
인터페이스의 intercept()
메소드를 override
하여 위에서 만든 메소드를 사용해줍니다.
이제 저의 OkHttpClient
에서 네트워크 통신을 실행할 때마다 자동으로 연결 상태가 끊겼음을 감지하고 exception
을 던지게 되었습니다.
저는 Koin
라이브러리를 통해 이렇게 사용하고 있습니다.
🙌 긴 글 읽어주셔서 감사합니다!
원문 글에서는 특정 인터넷의 사용 가능 여부까지 감지할 수 있는 기능까지 추가되어 있으니 필요하신 분들은 참고해보세요.
원문 글 글쓴이의 전체 코드가 작성된 깃허브 주소