博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
听说你还在用工具类来判断网络状态?试试这个吧,像使用EventBus一样简单优雅...
阅读量:6905 次
发布时间:2019-06-27

本文共 3557 字,大约阅读时间需要 11 分钟。

基本操作,先举栗子?

在项目中总是会有需要判断网络状态的地方,我们常用的方法就是抽出一个工具类,我顺手就是一个栗子?:

//判断网络是否可用public static boolean isNetworkAvailable() {    ConnectivityManager connectivityManager = (ConnectivityManager)                getApplication()                .getSystemService(Context.CONNECTIVITY_SERVICE);    ...    ...    return boolean;}复制代码

细致的你当然还会再写一个判断网络类型的方法,反手再来一个栗子?:

//返回当前网络类型public static NetType getNetType() {        ConnectivityManager connectivityManager = (ConnectivityManager)        getApplication()        .getSystemService(Context.CONNECTIVITY_SERVICE);        ...        ...    return NetType;}复制代码

然后我们就会在相应的操作前进行判断网络的判断:

if (NetworkUtils.isNetworkAvailable()) {	doSomething();} else {	doSomething();}if (NetworkUtils.getNetType()== xxx) {	doSomething();} else {	doSomething();}复制代码

这样做会有什么问题呢?

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

如何解决

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

通过以下方式来使用 NetStatusBus

  1. 通过 Gradle 添加依赖:
implementation 'com.sunchen:netstatusbus:0.1.4'复制代码
  1. Application 中初始化 NetStatusBus:
// 尽可能早的进行这一步操作, 建议在 Application 中完成初始化操作 NetStatusBus.getInstance().init(this);复制代码
  1. 根据你的生命周期来注册和注销订阅者,例如:
@Override public void onStart() {     super.onStart();     NetStatusBus.getInstance().register(this); } @Override public void onStop() {     super.onStop();     NetStatusBus.getInstance().unregister(this); }复制代码
  1. 声明你的订阅方法,在该方法中可以监听到网络状态的变更:
@NetSubscribe() public void doSometing(NetType netType) {   	//netType 会返回当前的网络类型为 NetType.WIFI 还是 NetType.MOBILE 或者NetType.NONE    Log.d(Constrants.LOG_TAG, netType.name()); }复制代码

到这里就已经结束了,你的所有网络操作已经都可以清晰优雅的在订阅方法中进行处理了,当然你也可以继续往下看。

特别说明

订阅方法可以选填一个NetType参数,可以通过NetType的值来判断当前网络类型。

@NetSubscribe中可以指定 mode用来设置订阅的模式,mode类型如下:

Mode.AUTO:这是默认值,任何网络状态发生变化,该类型订阅者都会被调用。

//所有网络变化都会被调用,可以通过 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 的思想。

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

以前我们是通过注册广播来实现绑定网络变更的监听,在Android 7.0 以后,Google 基于性能和安全原因对广播进行了很多限制,比如监听网络变更的广播 android.net.conn.CONNECTIVITY_CHANGE 使用静态注册的方式则无法生效,而动态注册的方式虽然可以生效但毕竟不是最优解。

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

总结

好的,这就关于 这个库的内容,希望可以对你有帮助,喜欢的话请不吝点赞,感谢。

转载地址:http://qzqdl.baihongyu.com/

你可能感兴趣的文章
IDEA 插件-码云
查看>>
Boost::Date_time库和time_from_string()函数的使用
查看>>
Linux定时任务crontab命令使用详解
查看>>
Example: Encoded SNMP Message - SNMP Tutorial
查看>>
【转】协方差的意义
查看>>
C#语言学习--基础部分(十八)数组参数
查看>>
MySql简单分页存储过程
查看>>
EF6 在原有数据库中使用 CodeFirst 总复习(五、生成发帖页面)
查看>>
UVA 277 Puzzle
查看>>
rancher中级(一)(rancher的存储,网络)
查看>>
个人总结
查看>>
【第40题】2019年OCP认证12C题库062考试最新考试原题
查看>>
怎样在linux下查找一个结构体的原始定义
查看>>
OpenApi开源项目以及总结
查看>>
UNIX-LINUX C语言编程->实验室->多次打开文件实验
查看>>
8.8
查看>>
http://www.cnblogs.com/kenshincui/p/3840294.html
查看>>
更改SQL SERVER默认端口
查看>>
ajax的traditional属性
查看>>
网络安全重点总结
查看>>