【绝非标题党】网络监听新姿势:APT编译时注解实现高扩展框架

maven central的地址

central.sonatype.com/search?q=io...

仓库

mavenCentral()

依赖方式

arduino 复制代码
implementation 'io.github.richzjc:netannotation:1.0.0'
implementation 'io.github.richzjc:network:1.0.0'
kapt 'io.github.richzjc:netCompiler:1.0.0'

Github地址

github.com/richzjc/Net...


优点

该库简化了写网络监听的相关代码。真正的实现了变向切面的编程!! 只需要通过一个注解就能实现相应的网络变化


注解说明

less 复制代码
@NetAvailable
该注解表示,监听到有网络了,如果想在监听到有网络时执行相应操作,则只需要给方法添加此注解

@NetLose
该注解表示,监听到无网络了,如果想在监听到无网络时执行相应操作,则只需要给方法添加此注解

@NetChange(netType = NetType.AUTO)
该注解表示,监听到网络切换了,如果想在监听到网络切换时执行相应操作,则只需要给方法添加此注解

NetType有四种取值

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

AUTO : 如果传入的参数是AUTO; 就相当于NetAvailable注解,监听到有网络 NONE : 如果传入的参数是NONE; 就相当于NetLOSE注解,监听到无网络


示例代码

less 复制代码
@NetLose
public void test(){
     //执行无网络的操作
}

@NetAvailable
public void testl(){
    //执行有网络的操作
}

@NetChange(netType =NetType.WIFI){
    //网络变成WIFI后,执行相应的操作
}

实现原理

基于APT注解处理器, 结合JavaPoet, 在编译时,动态生成类文件,可以下载工程自己跑一遍。


展示一下apt生成的类的源码

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;
  }
}

配置

需要在使用到注解的module下面的build.gradle文件中,添加如下配置:

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

初始化

将各个模块下面生成的NetChanner类添加到NetManager中:

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

注册与取消注册

在使用到注解的对应类里面,调用注册方法与取消注册方法,比如说在Activity里面:

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


@Override
    protected void onDestroy() {
        super.onDestroy();
        NetManager.unBind(this);
    }

添加混淆规则

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

若写得不对, 欢迎大家共同讨论!!!!

相关推荐
努力实干几秒前
C++ 面向对象与工程架构
开发语言·c++·架构
十年Java程序媛7 分钟前
JVM 基础与 GC 垃圾回收详解|可达性分析、分代模型、垃圾收集器、STW
java·开发语言·jvm·spring boot·后端·面试
Vitaliy Kostrov(柯维远)28 分钟前
客户端如何检查直播流:从流内标记到停止播放
android·运维·服务器·驱动开发·网络安全·系统架构·cdn
张张123y32 分钟前
后端第十三课:大模型评测(Evals)从 0 到 1——看完面试能讲明白
后端·面试·职场和发展·大模型评测·evals
aichitang20241 小时前
Meta Muse Spark Open:816B 巨型开放权重多模态 Agent 模型架构、部署实战与社区首测全解
大数据·人工智能·python·算法·ai·架构·spark
恋猫de小郭1 小时前
Dart 3.15 新特性:this 终于支持类型提升了
android·前端·flutter
阡陌数智1 小时前
Anthropic Claude Fable 5.1 长周期 Agent 原生架构解析:工具调用链路稳定性与 API 聚合平台落地实战
人工智能·语言模型·自然语言处理·架构·推荐算法
艾莉丝努力练剑1 小时前
【AI大模型接入SDK】ChatServer接口实现
c++·人工智能·学习·ai·架构·大模型·sdk
ii_best1 小时前
ios手机开发安卓脚本开发软件[按键精灵教程]从「找最小值」到「Boss 最近刷新」再到「屏幕范围极值」
android·ios·智能手机·自动化·按键精灵
开开心心就好2 小时前
安卓PDF处理工具,免费无广告零弹窗
android·服务器·开发语言·算法·pdf·ocr