仅作个人记录使用
收集了网上一波信息,AOP较好的实现是Aspect,但是Android中配置较为困难,且现有的实现在as3.0中出了问题,所以就放弃实战了,直接学理论吧
首先最经典的控件连续多次点击用AOP消化掉多余事件
我平时注解用的也不少,但是这个注解就厉害了,甚至不用我获取
还有一点就是原理是重新编译了Java代码,所以性能的损耗是在编译器中的,可以说是很不错了,兼顾了抽象与性能
给你看个经典的网络鉴权
/**
* Created by hcDarren on 2017/8/27.
* 处理网络检测切面
*/
@Aspect
public class SectionAspect {
/**
* 找到处理的切点
* * *(..) 可以处理所有的方法
*/
@Pointcut("execution(@com.darren.architect_day02.CheckNet * *(..))")
public void checkNetBehavior() {
}
/**
* 处理切面
*/
@Around("checkNetBehavior()")
public Object checkNet(ProceedingJoinPoint joinPoint) throws Throwable {
Log.e("TAG", "checkNet");
// 做埋点 日志上传 权限检测(我写的,RxPermission , easyPermission) 网络检测
// 网络检测
// 1.获取 CheckNet 注解 NDK 图片压缩 C++ 调用Java 方法
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
CheckNet checkNet = signature.getMethod().getAnnotation(CheckNet.class);
if (checkNet != null) {
// 2.判断有没有网络 怎么样获取 context?
Object object = joinPoint.getThis();// View Activity Fragment ; getThis() 当前切点方法所在的类
Context context = getContext(object);
if (context != null) {
if (!isNetworkAvailable(context)) {
// 3.没有网络不要往下执行
Toast.makeText(context,"请检查您的网络",Toast.LENGTH_LONG).show();
return null;
}
}
}
return joinPoint.proceed();
}
/**
* 通过对象获取上下文
*
* @param object
* @return
*/
private Context getContext(Object object) {
if (object instanceof Activity) {
return (Activity) object;
} else if (object instanceof Fragment) {
Fragment fragment = (Fragment) object;
return fragment.getActivity();
} else if (object instanceof View) {
View view = (View) object;
return view.getContext();
}
return null;
}
/**
* 检查当前网络是否可用
*
* @return
*/
private static boolean isNetworkAvailable(Context context) {
// 获取手机所有连接管理对象(包括对wi-fi,net等连接的管理)
ConnectivityManager connectivityManager = (ConnectivityManager)
context.getSystemService(Context.CONNECTIVITY_SERVICE);
if (connectivityManager != null) {
// 获取NetworkInfo对象
NetworkInfo[] networkInfo = connectivityManager.getAllNetworkInfo();
if (networkInfo != null && networkInfo.length > 0) {
for (int i = 0; i < networkInfo.length; i++) {
// 判断当前网络状态是否为连接状态
if (networkInfo[i].getState() == NetworkInfo.State.CONNECTED) {
return true;
}
}
}
}
return false;
}
}
Pointcut注解就是通过类似于正则表达式的式子,定位你要搜索的类名、方法等一系列条件。
看到这个@Around注解没,就是在对应方法开始执行时,再执行逻辑(这个方法可能我理解的不到位),还有@Before、@After注解了。
上面是网络鉴权,控件防抖也很好实现,就不说了。