据说你还在用工具类来判断网络状态?试试这个吧,像使用EventBus同样简单优雅

基本操作,先举例

在项目中老是会有须要判断网络状态的地方,咱们经常使用的方法就是抽出一个工具类,我顺手就是一个例:java

//判断网络是否可用
public static boolean isNetworkAvailable() {
   ConnectivityManager connectivityManager = (ConnectivityManager)       
               getApplication()
               .getSystemService(Context.CONNECTIVITY_SERVICE);
   if (connectivityManager == null) {
       return false;
   }
   NetworkInfo[] info = connectivityManager.getAllNetworkInfo();
   if (info != null) {
       for (NetworkInfo networkInfo : info) {
            if (networkInfo.getState() == NetworkInfo.State.CONNECTED) {
                return true;
            }
       }
   }
   return false;
}

细致的你固然还会再写一个判断网络类型的方法,反手再来一个例:android

//返回当前网络类型
public static NetType getNetType() {
    ConnectivityManager connectivityManager = (ConnectivityManager) 
           getApplication()
           .getSystemService(Context.CONNECTIVITY_SERVICE);
    if (connectivityManager == null) {
        return NetType.NONE;
    }
    NetworkInfo info = connectivityManager.getActiveNetworkInfo();
    if (info == null) {
        return NetType.NONE;
    }
    int type = info.getType();

    if (type == ConnectivityManager.TYPE_MOBILE) {
       return NetType.MOBILE;
    } else if (type == ConnectivityManager.TYPE_WIFI) {
       return NetType.WIFI;
    }
    return NetType.NONE;
}

而后就能够在相应的操做前进行判断网络的判断:api

if (NetworkUtils.isNetworkAvailable()) {
    doSomething();
} else {
    doSomething();
}

if (NetworkUtils.getNetType()== xxx) {
    doSomething();
} else {
    doSomething();
}

这样作会有什么问题呢?

1.首先最直观的,不够优雅,代码判断量太多,若是你的操做是须要频繁的监听网络状态,那么过多的if/ else确定会让后面维护变的眼花缭乱。
2.以上方法只能在网络操做以前判断网络状态,若用户在网络正常状况下发起操做而中间改变网络,好比下载中途忽然丢失网络,则此时没法作出相应的控制。
3.没法只针对某种网络类型进行监听,好比只想监听用户切换到 WiFi 网络时作出响应。
4.程序多处须要进行网络监听处理时,不能同时接收网络变化,必须逐个地方手动处理。安全

如何解决

接下来就是本文的重点,如何经过 NetStatusBus 这个库来解决以上问题,让你的网络状态监听变得史无前例的简单粗暴。网络

经过如下方式来使用 NetStatusBus

1.经过 Gradle 添加依赖:

implementation 'com.sunchen:netstatusbus:0.1.3'
Application 中初始化 NetStatusBus:
// 尽量早的进行这一步操做, 建议在 Application 中完成初始化操做
NetStatusBus.getInstance().init(this);

2.根据你的生命周期来注册和注销订阅者,例如:

@Override
public void onStart() {
    super.onStart();
    NetStatusBus.getInstance().register(this);
}

@Override
public void onStop() {
    super.onStop();
    NetStatusBus.getInstance().unregister(this);
}

3.声明你的订阅方法,在该方法中能够监听到网络状态的变动:

@NetSubscribe(netType = NetType.AUTO)
 public void doSometing(NetType netType) {
           //netType 会返回当前的网络类型为 NetType.WIFI 仍是 NetType.MOBIL 或者 NetType.NONE
             Log.d(Constrants.LOG_TAG, netType.name());
 }

到这里就已经结束了,你的全部网络操做已经均可以清晰优雅的在订阅方法中进行处理了,固然你也能够继续往下看。ide

特别说明

订阅方法必须填写一个NetType参数,能够经过NetType的值来判断当前网络类型。工具

@NetSubscribe中 netType为可选值,能够设置订阅的类型,可选值类型以下:性能

NetType.AUTOthis

这是默认值,任何网络状态发生变化,该类型订阅者都会被回调。同时会传入NetType参数告知你当前的网络类型,示例以下:.net

//任何网络状态发生变化,该类型订阅者都会被回调
@NetSubscribe(netType = NetType.AUTO)
public void netChange(NetType netType) {
    Log.d(Constrants.LOG_TAG, netType.name());
}
NetType.WIFI

只要当前是由 WIFI 改变引起的网络状态变化,该类型订阅者都会被回调。同时会传入NetType参数告知你当前的网络类型,示例以下:

// 当 wifi 链接时,或者没有网络时会回调此方法
@NetSubscribe(netType = NetType.WIFI)
public void netChange(NetType netType) {
    Log.d(Constrants.LOG_TAG, netType.name());
}
NetType.MOBILE

只要当前是由移动网络改变引起的网络状态变化,该类型订阅者都会被回调。同时会传入NetType参数告知你当前的网络类型,示例以下:

// 当正在使用移动网络时,或者没有网络时会回调此方法
@NetSubscribe(netType = NetType.MOBILE)
public void netChange(NetType netType) {
    Log.d(Constrants.LOG_TAG, netType.name());
}

NetType.NONE

只有当网络丢失时,该类型订阅者才会被回调。

// 只有当网络丢失时,该类型订阅者才会被回调。
@NetSubscribe(netType = NetType.NONE)
public void netChange(NetType netType) {
    Log.d(Constrants.LOG_TAG, netType.name());
}

它的原理是什么

有人会以为,我用个库爽就好了管它的原理干什么?

你放心,我只是小小的描述一下实现方式。

原理简单来讲,就是在全局初始化的时候就绑定对网络的变化监听。而后将进行注册的父类全部的订阅方法保存至集合中,这里涉及到一些方法的校验,最后在网络状态发生改变时利用 Java 反射机制遍历执行全部订阅方法。熟悉 EventBus 的小伙伴已经看出来了这里借鉴了一小部分 EventBus 的思想。

回到第一步,那么具体是如何绑定对网络状态变化的监听呢?

之前咱们是经过注册广播来实现绑定网络变动的监听,在Android 7.0 之后,Google 基于性能和安全缘由对广播进行了不少限制,好比监听网络变动的广播 android.net.conn.CONNECTIVITY_CHANGE 使用静态注册的方式则没法生效,而动态注册的方式虽然能够生效但毕竟不是最优解。

一样出于性能和安全,以及拥抱变化的角度,最终咱们仍是使用官方推荐的方式,利用 ConnectivityManager.NetworkCallback 来进行网络变化的监听,这是在Android 5.0即android api 21推出的API,目前Android 5.0以上的市场占有率在 85%以上,随着国内各大厂商正在积极的推动适配普及Android Q,这个比例还会进一步增大,因此我的人认为无需过于担忧低版本适配。

总结

好的,这就关于 NetStatusBus 这个库的内容,但愿能够帮助到须要的人。

相关文章
相关标签/搜索