# 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)`

```kotlin
fun LifecycleOwner.bindNetworkCallback(callback: (BooleanArray) -> Unit)
fun registGlobalNetworkCallback(callback: (BooleanArray) -> Unit): Int
fun unregistGlobalNetworkCallback(callbackIndex: Int)
```

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

```kotlin
currentNetState[NetType.NET_AVAILABLE] // 连接可用
currentNetState[NetType.NET_CONNECTED] // 连接到了 Internet
currentNetState[NetType.NET_WIFI]
currentNetState[NetType.NET_CELLULAR]
```

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

```kotlin
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)](https://gist.github.com/zsqw123/f5b7d776fedaefaa063474b6c7ad2768)


