[Kotlin] 인터넷 연결상태 확인(feat. NetworkInfo Deprecated 대체)

han·2021년 8월 30일
0

안드로이드 개발을 하는 도중 앱 시작부분에 인터넷 연결상태를 체크하고 넘어가면 괜찮을 것 같아서 체크하는 부분을 구상하고 개발을 진행했다.

그래서 인터넷 연경상태를 체크하는 방법에 대해서 찾아보았는데, 처음에는 NetworkInfo를 이용해서 인터넷 연결을 체크 했는데 안드로이드 상에서 Deprecated라는 문구가 보였다.

일단 NetworkInfo를 이용한 연결방법에 대해서 알아보자.

매니페스트 추가

NetworkInfo를 이용한 코드

class SplashActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_splash)

        if(isConnectInternet() != "null"){ // 인터넷 연결 성공
            val handler = Handler(Looper.getMainLooper())
            handler.postDelayed({
                val intent = Intent(baseContext, MainActivity::class.java)
                startActivity(intent)
                finish()
            }, 2000) // 2초
        }
        else{ // 인터넷 연결 실패
            val handler = Handler(Looper.getMainLooper())
            handler.postDelayed({
                val intent = Intent(baseContext, RecyclerView::class.java)
                startActivity(intent)
                finish()
            }, 3000) // 3초
        }


    }

    private fun isConnectInternet(): String { // 인터넷 연결 체크 함수
        val cm: ConnectivityManager =
            this.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
        val networkInfo: NetworkInfo? = cm.activeNetworkInfo
        return networkInfo.toString()
    }
}

Deprecated라는 문구를 보니 찝찝해서 왜 Deprecated되었는지 찾아보았다.

공식 사이트 : https://developer.android.com/reference/android/net/NetworkInfo

정리하자면 API29 이후부터는 NetworkInfo가 Deprecated되었는데, NetworkInfo의 치명적 단점이 실시간으로 체크할 수 없다는 것이다.

즉, 해당 코드가 호출되는 시점에서만 체크가 되고 그 이후부터는 연결이 해체되어도 체크를 못 한다는 것이다.
해서 가이드상 대안은, ConnectivityManager.NetworkCallback를 사용해서 인터넷 연결체크를 하라고 한다.

ConnectivityManager.NetworkCallback을 이용한 코드

class SplashActivity : AppCompatActivity() {

    private lateinit var cm2 : ConnectivityManager

    private val networkCallBack = object : ConnectivityManager.NetworkCallback() {
        override fun onAvailable(network: Network) {
            // 네트워크가 연결될 때 호출됩니다.
            Toast.makeText(this@SplashActivity, "연결성공$network",Toast.LENGTH_SHORT).show()
        }

        override fun onLost(network: Network) {
            // 네트워크가 끊길 때 호출됩니다.
            Toast.makeText(this@SplashActivity,"연결실패",Toast.LENGTH_SHORT).show()
        }
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_splash)

        val cm: ConnectivityManager =
            this.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager

        cm2 = this.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager

        val builder = NetworkRequest.Builder()
        cm2.registerNetworkCallback(builder.build(),networkCallBack)

	// NetworkInfo부분
        if(isConnectInternet() != "null"){
            val handler = Handler(Looper.getMainLooper())
            handler.postDelayed({
                val intent = Intent(baseContext, MainActivity::class.java)
                startActivity(intent)
                finish()
            }, 2000) // 2초
        }
        else{
            val handler = Handler(Looper.getMainLooper())
            handler.postDelayed({
                val intent = Intent(baseContext, RecyclerView::class.java)
                startActivity(intent)
                finish()
            }, 3000) // 3초
        }


    }

    override fun onDestroy() { // 콜백 해제
        super.onDestroy()
        cm2 = this.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
        cm2.unregisterNetworkCallback(networkCallBack)
    }

    private fun isConnectInternet(): String { // 인터넷 연결 체크 함수
        val cm: ConnectivityManager =
            this.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
        val networkInfo: NetworkInfo? = cm.activeNetworkInfo
        return networkInfo.toString()
    }
}

해서 사용해보니 NetworkInfo랑 다르게 네트워크 연결이 실시간으로 체크 되는걸 확인할 수 있었다.

주의할 것은 onDestroy() 부분에서 콜백 해제를 해주지 않는다면 계속해서 콜백이 되어 다른 액티비티에서도 인터넷 연결체크가 된다는거다.

결론은, 만약 본인이 개발하는게 앱 시작부분에서만 인터넷 연결 체크하는게 필요하다면 NetworkInfo로 간단하게 구현하면 되고,
그게 아니라 실시간으로 체크하는게 필요하다면 ConnectivityManager.NetworkCallback을 사용하면 사용하면 될 것 같다.

profile
개인 공부 및 기록겸 벨로그 시작

0개의 댓글