代码地址如下:
http://www.demodashi.com/demo/12976.html

XAOP

一个简易的AOP(Android)应用框架。囊括了最实用的AOP应用。

特点

  • 支持快速点击切片@SingleClick,支持设置快速点击的时间间隔。

  • 支持动态申请权限切片@Permission,支持自定义响应动作。

  • 支持主线程切片@MainThread

  • 支持IO线程切片@IOThread,支持多种线程池类型。

  • 支持日志打印切片@DebugLog,支持自定义日志记录方式。

  • 支持内存缓存切片@MemoryCache,支持设置缓存大小。

  • 支持磁盘缓存切片@DiskCache,支持自定义磁盘缓存,缓存有效时间等。

  • 支持自定义拦截切片@Intercept,支持自定义切片拦截。

1、演示

2、如何使用

目前支持主流开发工具AndroidStudio的使用,直接配置build.gradle,增加依赖即可.

2.1、Android Studio导入方法,添加Gradle依赖

1.先在项目根目录的 build.gradle 的 repositories 添加:

allprojects {
repositories {
...
maven { url "https://jitpack.io" }
}
}

2.再在项目根目录的 build.gradle 的 dependencies 添加xmark插件:

buildscript {
···
dependencies {
···
classpath 'com.github.xuexiangjys.XAOP:xaop-plugin:1.0.0'
}
}

3.在项目的 build.gradle 中增加依赖并引用xaop插件

apply plugin: 'com.xuexiang.xaop' //引用xaop插件

dependencies {
···
implementation 'com.github.xuexiangjys.XAOP:xaop-runtime:1.0.0' //添加依赖
}

4.在Application中进行初始化


XAOP.init(this); //初始化插件
XAOP.debug(true); //日志打印切片开启
XAOP.setPriority(Log.INFO); //设置日志打印的等级,默认为0 //设置动态申请权限切片 申请权限被拒绝的事件响应监听
XAOP.setOnPermissionDeniedListener(new PermissionUtils.OnPermissionDeniedListener() {
@Override
public void onDenied(List<String> permissionsDenied) {
ToastUtil.get().toast("权限申请被拒绝:" + Utils.listToString(permissionsDenied));
} }); //设置自定义拦截切片的处理拦截器
XAOP.setInterceptor(new Interceptor() {
@Override
public boolean intercept(int type, JoinPoint joinPoint) throws Throwable {
XLogger.d("正在进行拦截,拦截类型:" + type);
switch(type) {
case 1:
//做你想要的拦截
break;
case 2:
return true; //return true,直接拦截切片的执行
default:
break;
}
return false;
}
});

3、切片的使用

3.1、快速点击切片使用

1.使用@SingleClick标注点击的方法。注意点击的方法中一定要有点击控件View作为方法参数,否则将不起作用。

2.可以设置快速点击的时间间隔,单位:ms。不设置的话默认是1000ms。

@SingleClick(5000)
public void handleOnClick(View v) {
XLogger.e("点击响应!");
ToastUtil.get().toast("点击响应!");
hello("xuexiangjys", "666666");
}

3.2、动态申请权限切片使用

1.使用@Permission标注需要申请权限执行的方法。可设置申请一个或多个权限。

2.使用@Permission标注的方法,在执行时会自动判断是否需要申请权限。

@SingleClick
@Permission({PermissionConsts.CALENDAR, PermissionConsts.CAMERA, PermissionConsts.LOCATION})
private void handleRequestPermission(View v) { }

3.3、主线程切片使用

1.使用@MainThread标注需要在主线程中执行的方法。

2.使用@MainThread标注的方法,在执行时会自动切换至主线程。

@MainThread
private void doInMainThread(View v) {
mTvHello.setText("工作在主线程");
}

3.4、IO线程切片使用

1.使用@IOThread标注需要在io线程中执行的方法。可设置线程池的类型ThreadType,不设置的话默认是Fixed类型。

线程池的类型如下:

  • Single:单线程池
  • Fixed:多线程池
  • Disk:磁盘读写线程池(本质上是单线程池)
  • Network:网络请求线程池(本质上是多线程池)

2.使用@IOThread标注的方法,在执行时会自动切换至指定类型的io线程。

@IOThread(ThreadType.Single)
private String doInIOThread(View v) {
return "io线程名:" + Thread.currentThread().getName();
}

3.5、日志打印切片使用

1.使用@DebugLog标注需要打印的方法和类。可设置打印的优先级,不设置的话默认优先级为0。注意:如果打印的优先级比XAOP.setPriority设置的优先级小的话,将不会进行打印。

2.使用@DebugLog标注的类和方法在执行的过程中,方法名、参数、执行的时间以及结果都将会被打印。

3.可调用XAOP.setISerializer设置打印时序列化参数对象的序列化器。

4.可调用XAOP.setLogger设置打印的实现接口。默认提供的是突破4000限制的logcat日志打印。

@DebugLog(priority = Log.ERROR)
private String hello(String name, String cardId) {
return "hello, " + name + "! Your CardId is " + cardId + ".";
}

3.6、内存缓存切片使用

1.使用@MemoryCache标注需要内存缓存的方法。可设置缓存的key,不设置的话默认key为方法名+参数1+参数2+...

2.标注的方法一定要有返回值,否则内存缓存切片将不起作用。

3.使用@MemoryCache标注的方法,可自动实现缓存策略。默认使用的内存缓存是LruCache

4.可调用XAOP.initMemoryCache设置内存缓存的最大数量。默认是Runtime.getRuntime().maxMemory() / 1024) / 8

@MemoryCache
private String hello(String name, String cardId) {
return "hello, " + name + "! Your CardId is " + cardId + ".";
}

3.7、磁盘缓存切片使用

1.使用@DiskCache标注需要磁盘缓存的方法。可设置缓存的key,不设置的话默认key为方法名+参数1+参数2+...

2.可设置磁盘缓存的有效期,单位:s。不设置的话默认永久有效。

3.标注的方法一定要有返回值,否则磁盘缓存切片将不起作用。

4.使用@DiskCache标注的方法,可自动实现缓存策略。默认使用的磁盘缓存是JakeWharton的DiskLruCache

5.可调用XAOP.initDiskCache设置磁盘缓存的属性,包括磁盘序列化器IDiskConverter,磁盘缓存的根目录,磁盘缓存的最大空间等。

@DiskCache
private String hello(String name, String cardId) {
return "hello, " + name + "! Your CardId is " + cardId + ".";
}

3.8、自定义拦截切片使用

1.使用@Intercept标注需要进行拦截的方法和类。可设置申请一个或多个拦截类型。

2.如果不调用XAOP.setInterceptor设置切片拦截的拦截器的话,自定义拦截切片将不起作用。

3.使用@Intercept标注的类和方法,在执行时将自动调用XAOP设置的拦截器进行拦截处理。如果拦截器处理返回true的话,该类或方法的执行将被拦截,不执行。

4.使用@Intercept可以灵活地进行切片拦截。比如用户登录权限等。

@SingleClick(5000)
@DebugLog(priority = Log.ERROR)
@Intercept(3)
public void handleOnClick(View v) {
XLogger.e("点击响应!");
ToastUtil.get().toast("点击响应!");
hello("xuexiangjys", "666666");
} @DebugLog(priority = Log.ERROR)
@Intercept({1,2,3})
private String hello(String name, String cardId) {
return "hello, " + name + "! Your CardId is " + cardId + ".";
}

【注意】:当有多个切片注解修饰时,一般是从上至下依次顺序执行。

4、项目截图

代码地址如下:
http://www.demodashi.com/demo/12976.html

注:本文著作权归作者,由demo大师代发,拒绝转载,转载需要作者授权

XAOP的使用示范例子的更多相关文章

  1. XPage的使用示范例子

    代码地址如下:http://www.demodashi.com/demo/12975.html XPage [[api][apisvg]][api] 一个非常方便的fragment页面框架 特点 支持 ...

  2. FunDA(12)- 示范:强类型数据源 - strong typed data sources

    FunDA设计的主要目的是解决FRM(Functional Relation Mapping)如Slick这样的批次型操作工具库数据源行间游动操作的缺失问题.FRM产生的结果集就是一种静态集合,缺乏动 ...

  3. PyQt4入门学习笔记(四)

    在PyQt4中的事件和信号 事件 所有的GUI应用都是事件驱动的.事件主要是来自于应用的使用者,但是像互联网连接,窗口管理器或者计时器也可以产生事件.当我们调用应用的exec_()方法时,应用就进入了 ...

  4. 浅谈Slick(3)- Slick201:从fp角度了解Slick

    我在上期讨论里已经成功的创建了一个简单的Slick项目,然后又尝试使用了一些最基本的功能.Slick是一个FRM(Functional Relational Mapper),是为fp编程提供的scal ...

  5. RPC框架性能基本比较测试

    RPC框架:gRPC.Thrift.Wildfly.Dubbo 原文链接:http://www.open-open.com/lib/view/open1426302068107.html gRPC是G ...

  6. Cats(4)- 叠加Free程序运算结果,Stacking monadic result types

    在前面的几篇关于Free编程的讨论示范中我们均使用了基础类型的运算结果.但在实际应用中因为需要考虑运算中出现异常的情况,常常会需要到更高阶复杂的运算结果类型如Option.Xor等.因为Monad无法 ...

  7. Java Web编程技术学习要点及方向

    学习编程技术要点及方向亮点: 传统学习编程技术落后,应跟著潮流,要对业务聚焦处理.要Jar, 不要War:以小为主,以简为宝,集堆而成.去繁取简 Spring Boot,明日之春(future of ...

  8. Coursera系列-R Programming第三周-词法作用域

    完成R Programming第三周 这周作业有点绕,更多地是通过一个缓存逆矩阵的案例,向我们示范[词法作用域 Lexical Scopping]的功效.但是作业里给出的函数有点绕口,花费了我们蛮多心 ...

  9. Scalaz(40)- Free :versioned up,再回顾

    在上一篇讨论里我在设计示范例子时遇到了一些麻烦.由于Free Monad可能是一种主流的FP编程规范,所以在进入实质编程之前必须把所有东西都搞清楚.前面遇到的问题主要与scalaz Free的Free ...

随机推荐

  1. 详解nginx、php-fpm和mysql用户权限

    通常情况下,我们运行web应用的服务器有CentOS.Ubuntu.Debian等等的Linux发行版本.这时候,构成服务架构所必须的Nginx.php和MySQL等应用的权限控制就显得非常重要,各个 ...

  2. java Socket启动服务

    java -cp /Library/WebServer/Documents/Java/test/src com.zhidian.soft.sendOfClick localhost 8888 java ...

  3. [xampp] phpmyadmin 设置登录密码

    $ cd /opt/lampp/bin $ ./mysqladmin -u root password 'new_password' $ vim ../phpmyadmin/config.inc.ph ...

  4. 第3天-DIV+CSS布局

    盒子模型 margin 设置外边距宽度 有4个值的时候: maigin 10px 5px 15px 20px; (上.右.下.左)有3个值的时候: margin: 10px 5px 15px; (上. ...

  5. 02、Mecanim之IK动画

    序言:IK动画全名是Inverse Kinematics 意思是逆向动力学,就是子骨骼节点带动父骨骼节点运动. 比如体操运动员,只靠手来带动身体各个部位的移动.手就是子骨骼,身体就是它的父骨骼,这时运 ...

  6. 算法-插入排序(Insertion sorting)

    本文由@呆代待殆原创,转载请注明出处. 简介:这是一个比较算法,形象的描述插入算法就和我们玩扑克的时候我们排列手牌的方式是一样的,最开始我们手上什么都没有,然后我们每摸一张牌就把它插入到正确的位置,直 ...

  7. Problem G: 零起点学算法27——等级分制度

    #include<stdio.h> int main() { int a,b; while(scanf("%d %d",&a,&b)!=EOF) +a* ...

  8. c++基础类型之signed、unsigned的一个细节

    数值型 c++中,对于 int.long.int64....等这些数值类型,如果是有符合的,则类型前加不加 signed 其效果都是一样的. 比如如下声明: int nA; // 与 signed i ...

  9. jQuery的deferred对象详解(转)

    jQuery的开发速度很快,几乎每半年一个大版本,每两个月一个小版本. 每个版本都会引入一些新功能.今天我想介绍的,就是从jQuery 1.5.0版本开始引入的一个新功能----deferred对象. ...

  10. JQuery给动态HTML绑定事件

    说明:涉及到事件委托原理,这里不深究了. 直接使用live或者delegate去实现.网上说on也可以,没测试过. 注意:live在新版的JQuery已经取消.on在比较新的版本才支持. 参考: ht ...