当前位置:   article > 正文

项目集成AspectJX及常见问题_com.hujiang.aspectjx

com.hujiang.aspectjx

AspectJX基于AspectJ并在此基础上扩展出来可应用于Android开发平台的AOP框架,可作用于java源码,class文件及jar包,同时支持kotlin的应用。

AOP思想

AOP是面向切面编程,它在我们日志系统,权限管理,事件统一回调拦截,有着较好的应用。

在项目中,我们的很多的功能都分散到各个模块中,AOP的目的就是把他们集中起来放在一个统一的地方做管理。

AspectJ

AspectJ是AOP思想的一个具体实现方案,就是这样的一个工具。使用AspectJ一般用两种方式,一种是完全用AspectJ的语言开发,另一种是使用Java中的@Aspect注解

具体使用

  1. @Aspect
  2. public class SingleClickAOP {
  3. //上次点击的时间
  4. private static Long sLastClick = 0L;
  5. //拦截所有两次点击时间间隔小于一秒的点击事件
  6. private static final Long FILTER_TIME_UNIT = 1000L;
  7. //上次点击事件View
  8. private View lastView;
  9. // 定义切入点:View.OnClickListener#onClick()方法
  10. @Pointcut("execution(* android.view.View.OnClickListener.onClick(..))")
  11. private void methodViewOnClick() {
  12. }
  13. //直接setOnClickListener 拦截点击事件
  14. @Around("methodViewOnClick()")
  15. public void clickFilterHook(ProceedingJoinPoint joinPoint) throws Throwable {
  16. //大于指定时间
  17. if (System.currentTimeMillis() - sLastClick >= FILTER_TIME_UNIT) {
  18. Log.d(Constant.TAG, "AspectJX 单次点击");
  19. doClick(joinPoint);
  20. } else {
  21. //小于指定秒数 但是不是同一个view 可以点击 或者不过滤点击
  22. if (lastView == null || lastView != (joinPoint).getArgs()[0]) {
  23. doClick(joinPoint);
  24. } else {
  25. //大于指定秒数 且是同一个view
  26. Log.d(Constant.TAG, "AspectJX 重复点击,已过滤");
  27. }
  28. }
  29. }
  30. //执行原有的 onClick 方法
  31. private void doClick(ProceedingJoinPoint joinPoint) throws Throwable {
  32. //判断 view 是否存在
  33. if (joinPoint.getArgs().length == 0) {
  34. joinPoint.proceed();
  35. return;
  36. }
  37. //记录点击的 view(最好加上捕获类型转换异常的try)
  38. lastView = (View) (joinPoint).getArgs()[0];
  39. //记录点击事件
  40. sLastClick = System.currentTimeMillis();
  41. //执行点击事件
  42. try {
  43. joinPoint.proceed();
  44. } catch (Throwable throwable) {
  45. throwable.printStackTrace();
  46. }
  47. }
  48. }

采坑:

1:

  1. Default interface methods are only supported starting with Android N (--min-api 24):
  2. Lorg/aspectj/lang/ProceedingJoinPoint;stack$AroundClosure(Lorg/aspectj/runtime/inte
  3. rnal/AroundClosure;)V

将Java Version升级为1.8

  1. compileOptions {
  2. sourceCompatibility JavaVersion.VERSION_1_8
  3. targetCompatibility JavaVersion.VERSION_1_8
  4. }

2:

  1. Caused by: java.util.zip.ZipException: zip file is empty
  2. at java.util.zip.ZipFile.open(Native Method)
  3. at java.util.zip.ZipFile.(ZipFile.java:225)
  4. at java.util.zip.ZipFile.(ZipFile.java:279)
  5. at com.android.tools.r8.ArchiveClassFileProvider.(:24)
  6. at com.android.tools.r8.ArchiveClassFileProvider.(:1)
  7. at com.android.builder.dexing.r8.CachingArchiveClassFileProvider.(CachingArchiveClassFileProvider.java:32)
  8. at com.android.builder.dexing.r8.ClassFileProviderFactory.createProvider(ClassFileProviderFactory.java:123)
  9. at com.android.builder.dexing.r8.ClassFileProviderFactory.(ClassFileProviderFactory.java:93)
  10. at com.android.build.gradle.internal.transforms.DexArchiveBuilderTransform.transform(DexArchiveBuilderTransform.java:369)
  11. ... 99 more
  1. 在project的build.gralde里面加入
  2. classpath 'com.hujiang.aspectjx:gradle-android-plugin-aspectjx:2.0.10'
  3. 在app的build.gradle里面加入
  4. apply plugin: 'android-aspectjx'
  5. api 'org.aspectj:aspectjrt:1.9.5'
  6. aspectjx {
  7. enabled true
  8. exclude 'com.google'
  9. }

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/266746
推荐阅读
相关标签
  

闽ICP备14008679号