【绝非标题党】Android一行代码实现网络监听


为什么我说一行代码就能实现网络监听呢?

本人总结按照 "结论先行, 详细分析在后" 的逻辑, 先让大家的感性的认识, 然后理性的分析

结果

只需要在想要监听网络变化的方法上面添加相应的注解即可。 具体的实现原理,大家也可以参考EventBus通过Apt技术是如何实现。

为什么要将网络监听封装成一个库

网络监听可以说是在app中基本上会遇到的一个功能。 就我目前开发的项目而言,到处都在写网络监听的代码,感觉相当麻烦, 而且 代码冗余, 提高了耦合性,而且代码可读性也下降了。 自从写了这个库以后,以后项目里面要监听网络变化只需要添加注解即可

具体是如何使用的呢?

如果你的项目上线后是混淆过的, 那一定要注意:需要在用到网络监听的类上面添加keep注解防止混淆,以免上线后出问题。 例子:

在混淆文件里面添加:

kotlin 复制代码
-keepclasseswithmembernames class * {
     @com.richzjc.netannotation.* <methods>;
 }

在项目的根目录下面的build.gralde添加maven仓库。

arduino 复制代码
 maven { url "https://dl.bintray.com/richzjc/maven" }

其次是在module的build.gradle引用

arduino 复制代码
如果项目用的kotlin 请将annotationProcessor 改成kapt
annotationProcessor 'com.richzjc:netChange_compiler:1.1.2'
implementation 'com.richzjc:network_change:1.0.9'

因为项目使用了apt的技术,在编译期会生成类, 因此需要在对应module下面的gradle文件添加如下配置

ini 复制代码
javaCompileOptions {
            annotationProcessorOptions {
                arguments = [ moduleName : project.getName() ]
            }
        }

则最后会生成NetChanger的类: 如:

csharp 复制代码
public class NetChanger implements SubscribeInfoIndex {
  private static final Map<Class, SimpleSubscribeInfo> SUBSCRIBER_INDEX;

  static {
    SUBSCRIBER_INDEX = new HashMap<Class, SimpleSubscribeInfo>();
    List<SubscribeMethod> availableList;
    List<SubscribeMethod> loseList;
    List<SubscribeMethod> changeList;
    availableList = new ArrayList();
    loseList = new ArrayList();
    changeList = new ArrayList();
    availableList.add(new SubscribeMethod("test1", null));
    loseList.add(new SubscribeMethod("test", null));
    changeList.add(new SubscribeMethod("test2", NetType.AUTO));
    changeList.add(new SubscribeMethod("test3", NetType.WIFI));
    SUBSCRIBER_INDEX.put(MainActivity.class, new SimpleSubscribeInfo(availableList, loseList, changeList));
  }

  @Override
  public Map<Class, SimpleSubscribeInfo> getSubscriberInfo() {
    return SUBSCRIBER_INDEX;
  }
}

在使用这个库的时候需要在对应的Application下面初始化: 将apt生成的类添加到NetManager里面。 然后调用init方法

csharp 复制代码
NetManager.addIndex(new NetChanger());
NetManager.init(this);

最后如果在MainActivity里面想要添加网络监听,则需要在MainActivity里面 添加注册与 反注册的方法:

如: 在Oncreate里面添加注册:

typescript 复制代码
 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        NetManager.bind(this);
    }

一般在ondestroy方法里面添加反注册

typescript 复制代码
@Override
    protected void onDestroy() {
        super.onDestroy();
        NetManager.unBind(this);
    }

如果按照以上配置好了。 那么在MainActivity里面添加的代码 就能够监听到网络的变化。

详细说明

NetAvailable

监听到有网络

NetLose

监听没有网络

NetChange

该注解需要传一个netType netType有四个取值可能

vbnet 复制代码
public enum NetType {
    AUTO, WIFI, MOBILE, NONE;
}

当netType传为AUTO 就相当于NetAvailable 当netType传为NONE就相当于 NetLose 当netType传为MOBILE就相当于 监听除wifi以外的网络 当netType传为WIFI就相当于 监听wifi

gitHub地址

多学总比少学好

所谓 面试造飞机, 入职拧螺丝。 这句话一点也不假, 面试时的技术不仅仅 是 要学会用, 还得要知其原理。懂其原理,才能区分其技术水平, 而作为android开发的我们, java作为我们的开发语言。 所以面试官往往会问一些java底层的原理。这其中包括, java 多线程, 各种各样的锁机制, 以及cas, 原子性 的问题。

相关推荐
柿蒂9 分钟前
Android图片批量添加处理优化:从「30」秒缩短至「4.4」秒
android·android jetpack
SimonKing1 小时前
甩掉手动赋值!MyBatis-Plus 自动填充实战秘籍
java·后端·程序员
袁煦丞1 小时前
5分钟搭建高颜值后台!SoybeanAdmin:cpolar内网穿透实验室第648个成功挑战
前端·程序员·远程工作
拓端研究室1 小时前
专题:2025医药生物行业趋势与投融资研究报告|附90+份报告PDF、原数据表汇总下载
android·开发语言·kotlin
小鱼人爱编程1 小时前
当上组长一年里,我保住了俩下属
android·前端·后端
2501_916013741 小时前
移动端 WebView 调试实战,多平台行为差异排查与统一调试流程
android·ios·小程序·https·uni-app·iphone·webview
liosen5 小时前
【安卓笔记】OOM与内存优化
android·oom·内存优化·内存分析命令·内存分析工具
猿小蔡-Cool10 小时前
Android ADB命令之内存统计与分析
android·adb
Monkey-旭10 小时前
Android Handler 完全指南
android·java·handler
從南走到北11 小时前
JAVA东郊到家按摩服务同款同城家政服务按摩私教茶艺师服务系统小程序+公众号+APP+H5
android·java·开发语言·微信小程序·小程序