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注解了。
上面是网络鉴权,控件防抖也很好实现,就不说了。