首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Connectivity管理器侦听网络更改

使用Connectivity管理器侦听网络更改
EN

Stack Overflow用户
提问于 2020-12-15 10:11:17
回答 2查看 705关注 0票数 1

我正在尝试使用registerDefaultNetworkCallback() of conenctivityManager方法监听网络更改,使用下面来自answer的代码

代码语言:javascript
复制
     val connectivityManager = cotnext.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
        connectivityManager?.let {
            it.registerDefaultNetworkCallback(object : ConnectivityManager.NetworkCallback() {
                override fun onAvailable(network: Network) {
                    //take action when network connection is gained
                }
                override fun onLost(network: Network) {
                    //take action when network connection is lost
                }
            })
        }

但我对这种方法有几个疑问:

  1. ,如果手机连接到wifi,但是wifi没有连接到Internet
  2. ,在我阅读的方法文档中--我不明白--到底什么时候会达到极限?如果回调被调用100次,那么会引发异常吗?怎么处理呢?

为了避免由于应用程序泄漏回调而导致的性能问题,系统将将未执行请求的数量限制在每个应用程序(由其UID标识),与此方法的所有变体共享的ConnectivityDiagnosticsManager.registerConnectivityDiagnosticsCallback.和requestNetwork。使用此方法请求网络将计算到此限制。如果超过此限制,将引发异常。为了避免出现此问题并节省资源,请确保使用unregisterNetworkCallback(ConnectivityManager.NetworkCallback).注销回调。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-01-13 16:33:51

  1. ,如果手机连接到wifi,但是wifi没有连接到Internet

,怎么办?

答案,此方法将返回false。

  1. 在方法文档中读到了这个我不明白的内容,到底什么时候会达到极限?如果回调被调用100次,那么会引发异常吗?怎么处理呢?

我认为这意味着如果你不能注册超过100个回调

票数 1
EN

Stack Overflow用户

发布于 2020-12-15 10:21:42

首先,添加ConnectivityReceiver类:

代码语言:javascript
复制
class ConnectivityReceiver : BroadcastReceiver() {
    override fun onReceive(context: Context, intent: Intent) {
        if (connectivityReceiverListener != null) {
            connectivityReceiverListener!!.onNetworkConnectionChanged(
                isConnectedOrConnecting(
                    context
                )
            )
        }
    }

    private fun isConnectedOrConnecting(context: Context): Boolean {
        val cm = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager

        if (cm != null) {
            if (Build.VERSION.SDK_INT < 23) {
                val ni = cm.activeNetworkInfo
                if (ni != null) {
                    return ni.isConnected && (ni.type == ConnectivityManager.TYPE_WIFI || ni.type == ConnectivityManager.TYPE_MOBILE)
                }
            } else {
                val n = cm.activeNetwork
                if (n != null) {
                    val nc = cm.getNetworkCapabilities(n)
                    return nc!!.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) || nc!!.hasTransport(
                        NetworkCapabilities.TRANSPORT_WIFI
                    )
                }
            }
        }
        return false
    }

    interface ConnectivityReceiverListener {
        fun onNetworkConnectionChanged(isConnected: Boolean)
    }

    companion object {
        var connectivityReceiverListener: ConnectivityReceiverListener? = null
    }

}

然后在BaseActivityMainActivity中添加以下行:

代码语言:javascript
复制
 abstract class BaseActivity:AppCompatActivity(), 
      ConnectivityReceiver.ConnectivityReceiverListener {

var receiver: ConnectivityReceiver? = null

override fun onResume() {
        super.onResume()
        try {
            receiver = ConnectivityReceiver()
            registerReceiver(
                receiver!!,
                IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION)
            )
            connectivityReceiverListener = this
        } catch (ex: Exception) {
            //Timber.d("Base ex ${ex.localizedMessage}")
        }

    }

    override fun onPause() {
        try {
            unregisterReceiver(receiver!!)
            receiver = null

        } catch (ex: Exception) {
        }
        super.onPause()

    }

 override fun onNetworkConnectionChanged(isConnected: Boolean) {
        showMessage(isConnected)
    }


private fun showMessage(isConnected: Boolean) {
    try {
        if (!isConnected) {
           Log.d("Connection state"," disconnected")
        } else {
            Log.d("Connection state"," connected")
        }
    } catch (ex: Exception) {
       
    }
} 
}

您应该在OnResume方法中注册接收器,然后在OnPause方法中取消注册。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65303792

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档