当前位置: 移动技术网 > IT编程>移动开发>Android > Android开发Aspect解析

Android开发Aspect解析

2018年10月26日  | 移动技术网IT编程  | 我要评论

吴雪皮,于欣萌,金亚拉克的末日

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注解了。

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

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网