欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android开发Aspect解析

程序员文章站 2022-06-30 14:18:19
android开发aspect解析。首先最经典的控件连续多次点击用aop消化掉多余事件。 我平时注解用的也不少,但是这个注解就厉害了,甚至不用我获取 还有一点就是原理是重新编译了java代码,所以性...

android开发aspect解析。首先最经典的控件连续多次点击用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注解了。

上面是网络鉴权,控件防抖也很好实现,就不说了。