那么什么是 AOP ? 好处又有什么?
面向切面(AOP)其实就是把众多方法中的所有共有代码全部抽取出来,放置到某个地方集中管理,然后在具体运行时,再由容器动态织入这些共有代码的话,最起码可以解决两个问题:
1.1 Android程序员在编写具体的业务逻辑处理方法时,只需关心核心的业务逻辑处理,既提高了工作效率,又使代码变更简洁优雅。
1.2 在日后的维护中由于业务逻辑代码与共有代码分开存放,而且共有代码是集中存放的,因此使维护工作变得简单轻松
基础概念
- Aspect 切面:切面是切入点和通知的集合。
- PointCut 切入点:切入点是指那些通过使用一些特定的表达式过滤出来的想要切入Advice的连接点。
- Advice 通知:通知是向切点中注入的代码实现方法
- Joint Point 连接点:所有的目标方法都是连接点.
- Weaving 编织:主要是在编译期使用AJC将切面的代码注入到目标中, 并生成出代码混合过的.class的过程.
一般使用场景:日志切面,权限切面,网络切面等
基本使用:
1 下载aspectJ架包
2 安装
3 build.gradle配置
4 aspectJ安装目录下copy 一个开发包(aspectjrt.jar架包)到AS中
实例(判断是否有网络):
1.标记切点
@Target(ElementType.METHOD)//表示注解放在哪上 METHOD 方法上
@Retention(RetentionPolicy.RUNTIME)/在什么时候编译,RUNTIME运行时
public @interface CheckNet {
}
2.处理切点,切面
@Aspect //在类上面
public class HandleCheckeNet {
/**
* 处理切点
* 固定写法,"execution(@切点的包名下的切点注解方法 加上 **(..))")
**(..)代表所有方法
*/
@Pointcut("execution(@wangandroid.com.aopdemo.CheckNet * *(..))")
public void checkBehavior() {
}
/**
* 处理切面
*/
@Around("checkBehavior()")
public Object checkNet(ProceedingJoinPoint joinPoint) throws Throwable {
Log.e("TAG", "checkNet");
// 做埋点 日志上传 权限检测 网络检测
// 网络检测
// 1.获取 CheckNet 注解
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
CheckNet checkNet = signature.getMethod().getAnnotation(CheckNet.class);
if (checkNet != null) {
//判断有没有网络,先要获取context;
Object object = joinPoint.getThis();
Context context = getContext(object);
//判断是否有网络
if (!isNetworkAvailable(context)){
// 没有网络不要往下执行
Toast.makeText(context,"请检查您的网络",Toast.LENGTH_LONG).show();
return null;
}
}
return joinPoint.proceed();
}
}
3.使用
@CheckNet
public void aopTest(View view) {
Intent intent = new Intent(MainActivity.this, Main2Activity.class);
startActivity(intent);
}
学会AOP,在以后的编程中就可以提高效率,使代码整洁
源代码:https://github.com/wubobo952/AopDemo