为什么我说一行代码就能实现网络监听呢?
本人总结按照 “结论先行, 详细分析在后” 的逻辑, 先让大家的感性的认识, 然后理性的分析
结果
只需要在想要监听网络变化的方法上面添加相应的注解即可。
具体的实现原理,大家也可以参考EventBus通过Apt技术是如何实现。
为什么要将网络监听封装成一个库
网络监听可以说是在app中基本上会遇到的一个功能。
就我目前开发的项目而言,到处都在写网络监听的代码,感觉相当麻烦,
而且 代码冗余, 提高了耦合性,而且代码可读性也下降了。
自从写了这个库以后,以后项目里面要监听网络变化只需要添加注解即可
具体是如何使用的呢?
如果你的项目上线后是混淆过的, 那一定要注意:需要在用到网络监听的类上面添加keep注解防止混淆,以免上线后出问题。
例子:
在混淆文件里面添加:
-keepclasseswithmembernames class * {
@com.richzjc.netannotation.* <methods>;
}
在项目的根目录下面的build.gralde添加maven仓库。
```
mavenCentral()
其次是在module的build.gradle引用
如果项目用的kotlin 请将annotationProcessor 改成kapt
implementation 'io.github.richzjc:netannotation:1.0.0'
implementation 'io.github.richzjc:network:1.0.0'
kapt 'io.github.richzjc:netCompiler:1.0.0'
因为项目使用了apt的技术,在编译期会生成类,
因此需要在对应module下面的gradle文件添加如下配置
javaCompileOptions {
annotationProcessorOptions {
arguments = [ moduleName : project.getName() ]
}
}
则最后会生成NetChanger的类:
如:
public class NetChanger implements SubscribeInfoIndex { private static final Map<Class, SimpleSubscribeInfo> SUBSCRIBER_INDEX;
static { SUBSCRIBER_INDEX = new HashMap<Class, SimpleSubscribeInfo>(); List availableList; List loseList; List 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方法
NetManager.addIndex(new NetChanger());
NetManager.init(this);
最后如果在MainActivity里面想要添加网络监听,则需要在MainActivity里面
添加注册与 反注册的方法:
如: 在Oncreate里面添加注册:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); NetManager.bind(this); }
一般在ondestroy方法里面添加反注册
@Override
protected void onDestroy() {
super.onDestroy();
NetManager.unBind(this);
}
如果按照以上配置好了。 那么在MainActivity里面添加的代码
就能够监听到网络的变化。
## **详细说明**
NetAvailable
> 监听到有网络
NetLose
> 监听没有网络
NetChange
> 该注解需要传一个netType
> netType有四个取值可能
public enum NetType {
AUTO, WIFI, MOBILE, NONE;
}
当netType传为AUTO 就相当于NetAvailable
当netType传为NONE就相当于 NetLose
当netType传为MOBILE就相当于 监听除wifi以外的网络
当netType传为WIFI就相当于 监听wifi
[gitHub地址](https://github.com/richzjc/NetworkListener)
### 多学总比少学好
**所谓 `面试造飞机, 入职拧螺丝`。 这句话一点也不假, 面试时的技术不仅仅 是 要学会用, 还得要知其原理。懂其原理,才能区分其技术水平, 而作为android开发的我们, java作为我们的开发语言。 所以面试官往往会问一些java底层的原理。这其中包括, java 多线程, 各种各样的锁机制, 以及cas, 原子性 的问题。**