目录

Network Callback

Network Callback

大多数情况下, 用户的设备都是有网络的, 但是当网络切换或者网络不佳的时候, 如果界面没能得到合适的数据, 就有可能出现crash, 我们有必要进行一定的特殊处理, 首先就是要读取网络状态并进行回调

这个类经常改, 大多数方法为API21, 部分需要更高版本, 具体如下:

方法 调用时刻
onAvailable(network) 连接可用
onBlockedStatusChanged(network, blocked) API29 网络被阻止解除阻塞
onCapabilitiesChanged(network, networkCapabilities) 状态修改但仍旧可用
onLinkPropertiesChanged(network, linkProperties) 连接属性修改
onLosing(network, maxMsToLive) 正在断开连接
onLost(network) 已断开连接
onUnavailable() API26 连接超时达不到可用要求

我做了一个简单的工具来实现一些基础需求(有无网络,WIFI/流量):

其中有三个方法:分别实现了跟随生命周期注册和解注册事件,以及全局注册和解注册事件,注意使用之前需要提前初始化NetCallback.init(application)

1
2
3
fun LifecycleOwner.bindNetworkCallback(callback: (BooleanArray) -> Unit)
fun registGlobalNetworkCallback(callback: (BooleanArray) -> Unit): Int
fun unregistGlobalNetworkCallback(callbackIndex: Int)

回调获取网络状态通过Lambda语句回调的BooleanArray传入指定NetType来获取到是否连接

1
2
3
4
currentNetState[NetType.NET_AVAILABLE] // 连接可用
currentNetState[NetType.NET_CONNECTED] // 连接到了 Internet
currentNetState[NetType.NET_WIFI]
currentNetState[NetType.NET_CELLULAR]

当然也可以直接通过NetCallback的静态成员获取网络状态:

1
2
3
4
NetCallback.currentNetState[NetType.NET_AVAILABLE] // 连接可用
NetCallback.currentNetState[NetType.NET_CONNECTED] // 连接到了 Internet
NetCallback.currentNetState[NetType.NET_WIFI]
NetCallback.currentNetState[NetType.NET_CELLULAR]

gist: learn-2-NetCallback (github.com)