在项目中老是会有须要判断网络状态的地方,咱们经常使用的方法就是抽出一个工具类,我顺手就是一个栗子🌰:java
//判断网络是否可用
public static boolean isNetworkAvailable() {
ConnectivityManager connectivityManager = (ConnectivityManager)
getApplication()
.getSystemService(Context.CONNECTIVITY_SERVICE);
...
...
return boolean;
}
复制代码
细致的你固然还会再写一个判断网络类型的方法,反手再来一个栗子🌰:android
//返回当前网络类型
public static NetType getNetType() {
ConnectivityManager connectivityManager = (ConnectivityManager)
getApplication()
.getSystemService(Context.CONNECTIVITY_SERVICE);
...
...
return NetType;
}
复制代码
而后咱们就会在相应的操做前进行判断网络的判断:git
if (NetworkUtils.isNetworkAvailable()) {
doSomething();
} else {
doSomething();
}
if (NetworkUtils.getNetType()== xxx) {
doSomething();
} else {
doSomething();
}
复制代码
if
/ else
确定会让后面维护变的眼花缭乱。接下来就是本文的重点,如何经过 NetStatusBus 这个库来解决以上问题,让你的网络状态监听变得史无前例的简单粗暴。github
implementation 'com.sunchen:netstatusbus:0.1.4'
复制代码
// 尽量早的进行这一步操做, 建议在 Application 中完成初始化操做
NetStatusBus.getInstance().init(this);
复制代码
@Override
public void onStart() {
super.onStart();
NetStatusBus.getInstance().register(this);
}
@Override
public void onStop() {
super.onStop();
NetStatusBus.getInstance().unregister(this);
}
复制代码
@NetSubscribe()
public void doSometing(NetType netType) {
//netType 会返回当前的网络类型为 NetType.WIFI 仍是 NetType.MOBILE 或者NetType.NONE
Log.d(Constrants.LOG_TAG, netType.name());
}
复制代码
到这里就已经结束了,你的全部网络操做已经均可以清晰优雅的在订阅方法中进行处理了,固然你也能够继续往下看。api
订阅方法能够选填一个NetType
参数,能够经过NetType
的值来判断当前网络类型。安全
@NetSubscribe
中能够指定 mode
用来设置订阅的模式,mode
类型以下:网络
Mode.AUTO
:这是默认值,任何网络状态发生变化,该类型订阅者都会被调用。ide
//全部网络变化都会被调用,能够经过 NetType 来判断当前网络具体状态
@NetSubscribe(mode = Mode.AUTO)
public void netChange(NetType netType) {
Log.d(Constrants.LOG_TAG, netType.name());
}
复制代码
Mode.WIFI
:由 WIFI 改变引起的网络状态变化的状况下(wifi链接和断开),该类型订阅者会被调用。工具
// 当 wifi 链接和失去链接时都被调用
@NetSubscribe(mode = Mode.WIFI)
public void wifiChange(NetType netType) {
Log.d(Constrants.LOG_TAG, netType.name());
}
复制代码
Mode.WIFI_CONNECT
: 仅在 WIFI 成功链接后,该类型订阅者会被调用。性能
// 只有当 wifi 链接时都被调用
@NetSubscribe(mode = Mode.WIFI_CONNECT)
public void wifiChange() {
Log.d(Constrants.LOG_TAG, "链接到wifi网络");
}
复制代码
Mode.MOBILE
: 由移动网络改变引起的网络状态变化的状况时(移动网络链接和断开),该类型订阅者会被回调。
// 当移动网络链接和失去链接时都会被调用
@NetSubscribe(mode = Mode.MOBILE)
public void netChange(NetType netType) {
Log.d(Constrants.LOG_TAG, netType.name());
}
复制代码
Mode.MOBILE _CONNECT
: 仅在移动网络成功链接后,会被回调。
// 当移动网络链接时调用
@NetSubscribe(mode = Mode.MOBILE _CONNECT)
public void netChange() {
Log.d(Constrants.LOG_TAG, "链接到移动网络");
}
复制代码
Mode.NONE
: 只有当网络丢失时,该类型订阅者才会被回调。
// 只有当网络丢失时,该类型订阅者才会被回调。
@NetSubscribe(mode = Mode.NONE)
public void netChange() {
Log.d(Constrants.LOG_TAG, "失去网络");
}
复制代码
有人会以为,我用个库爽就好了管它的原理干什么?
你放心,我只是小小的描述一下实现方式。
原理简单来讲,就是在全局初始化的时候就绑定对网络的变化监听。而后将进行注册的父类全部的订阅方法保存至集合中,这里涉及到一些方法的校验,最后在网络状态发生改变时利用 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 这个库的内容,但愿能够对你有帮助,喜欢的话请不吝点赞,感谢。