android studio 如何持续检查是否有活动的互联网连接

android studio How to continuously check if there is an active internet connection

我已经阅读了互联网上发布的许多其他答案,但它们并不是我要找的,我知道如何检查设备是否 connected/disconnectedinternet/mobile data 我想做的是检查数据是否可以通过该网络传输,您可能已连接到网络但可能无法通过该网络传输数据。

这是我现在正在做的事情

 val listener = object : ConnectivityManager.NetworkCallback() {
        override fun onAvailable(network: Network) {
            super.onAvailable(network)
            isActiveNetwork()
        }

        override fun onUnavailable() {
            super.onUnavailable()
       }

        override fun onLost(network: Network) {
            super.onLost(network)
            // no internet
         }
    }

(getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager).registerNetworkCallback(NetworkRequest.Builder().build(), listener )

isActiveNetwork方法用于检查互联网连接是否有效

private fun isActiveNetwork(){
    try {
        if(InetAddress.getByName("www.google.com").isReachable(5000)){
             //active
        }            
        else{
            // not active
        } 
    } catch (e: Exception) {
        //not active
    }
}

问题是这个方法会检查一次互联网连接是否有效,仅此而已,我已经尝试过

private fun isActiveNetwork(){
    try {
        if(InetAddress.getByName("www.google.com").isReachable(5000)){
             //active
        }            
        else{
            isActiveNetwork()
        } 
    } catch (e: Exception) {
        isActiveNetwork()
    }
}

尝试每 5 秒检查一次互联网连接是否有效,但这导致我的应用程序崩溃,因为 Whosebug...有什么建议吗?

您可以使用 Runnable 和 post 它使用处理程序每​​ 5 秒连续检查一次互联网连接。声明一个全局布尔变量 isConnected 并创建一个 Runnable,如:

private var isActiveNetwork= object : Runnable {
        override fun run() {
            try {
                if(InetAddress.getByName("www.google.com").isReachable(5000)) 
                 {
                  isConnected = true
                 }            
               else{
                  isConnected = false
                 }
               Handler().postDelayed(this,5000) 
              } 
          catch (e: Exception) {
              isConnected = false
         }

        }
    }

现在您可以从网络请求回调中启动此 Runnable:

 override fun onAvailable(network: Network) {
            super.onAvailable(network)
            Handler().post(isActiveNetwork)
        }