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

前言

切面编程一直是一个热点的话题,这篇文章讲讲一个第三方aop库在android上的应用。第三方AOP库官网网址在MainActivity类的头部已经说明

这章涉及到以下内容:

  1. aop库的配置
  2. aop导入问题解决
  3. aop的使用
  4. aop混淆
  5. 项目结构图和效果图
一. aop库的配置

在你的porject的build.gradle中做以下配置:

buildscript {

    repositories {
google()
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.0.0' //AOP切面编程依赖
classpath 'com.hujiang.aspectjx:gradle-android-plugin-aspectjx:1.1.1'
classpath 'org.aspectj:aspectjtools:1.8.13'
}
} allprojects {
repositories {
google()
jcenter()
}
} task clean(type: Delete) {
delete rootProject.buildDir
}

在 app module 的buildle.gradle中做如下配置:

 //AOP切面编程依赖
compile 'com.safframework:saf-aop:1.2.0'
//rxjava2.x
compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
compile 'io.reactivex.rxjava2:rxjava:2.1.0'
//AOP切面编程Cache依赖
implementation 'com.safframework:saf-cache:1.1.0'
implementation 'tony-common:tony-common-utils:1.2.4'
//AOP切面编程Log依赖
implementation 'com.safframework.log:saf-log:1.5.0'
//AOP切面编程AppPrefs依赖
implementation 'com.safframework.injectview:saf-injectview:1.0.0'
annotationProcessor 'com.safframework.injectview:saf-injectview-compiler:1.0.0'

需要注意的是,AOP库使用的时候,也要添加RxJava2.X的引用。

二. aop导入问题解决

在导入切面编程库依赖的时候,可能会出现如下问题:

Error:Execution failed for task ':app:transformClassesWithExtractJarsForDebug'.
> Unexpected scopes found in folder 'C:\my_demo_test\TestDemo\app\build\intermediates\transforms\AspectTransform\debug'.
Required: SUB_PROJECTS. Found:
EXTERNAL_LIBRARIES, PROJECT, SUB_PROJECTS

解决方案如下:

造成上述问题是由于as版本,需将Android studio的instant run关闭。具体如下:
Settings → Build, Execution, Deployment → Instant Run and uncheck Enable Instant Run.

配图如下:

三. aop的使用

AOP涉及的注解有以下几个:



下面对各注解依次讲解:

3.1 Async异步注解

使用类似如下:

@Async
private void AsyncTest(){
LogUtil.e("====当前线程===="+Thread.currentThread().getId());
LogUtil.e("====主线程===="+ Looper.getMainLooper().getThread().getId());
}

在主线程中调用 AsyncTest 方法,会发现其运行在一个不同于主线程的子线程中。

3.2 Cacheable缓存注解

存储数据如下:

@Cacheable(key = "name")
private String putCache(){
return "我是谁";
}

获取缓存数据:

private String getCache(){
Cache cache=Cache.get(CacheActivity.this);
//Cache的存取方式就是Acache,只不过存储地址改成了缓存而已
String name=cache.getString("name");
return name;
}
3.3 Log注解

你可以类似这样使用:

@LogMethod
private void log1(){
LogUtil.e("=====log1======");
} @LogMethod
private String log2(String s){
LogUtil.e("=====log2======"+s);
return s;
}

然后在需要用到的地方直接调用 log1 和 log2 方法就可以打印log了,它最大的好处是不会在代码中穿插各种 Log代码。

3.4 Hook注解

使用范例:

@HookMethod(beforeMethod = "before",afterMethod = "after")
private void getMachine(){
LogUtil.e("======getMachine=====");
} private void before(){
LogUtil.e("====开始时间=======");
} private void after(){
LogUtil.e("====结束时间=======");
}

然后在调用getMachine方法的时候,你会收到这样的log



这个可以用来监测一个方法执行的用时,当然,你在声明Hook注解的时候必须包含 beforeMethod,afterMethod中的一个或同时具有,若不声明,则Hook使用无效

3.5 Prefs注解

类似手机上的文件存储,存值你可以这样操作:

@Prefs(key = "key")
private String putPrefs(){
return "大家好";
}

取值是这样的:

private String getPrefs(){
AppPrefs appPrefs=AppPrefs.get(PrefsActivity.this);
String key=appPrefs.getString("key",null);
return key;
}
3.6 safe注解

保证代码执行安全的,若不想代码抛出异常,你可以这样处理:

@Safe
private void testStringLength(){
String msg=null;
int length=msg.length();
}

这样,你在调用 testStringLength 方法的时候就不会报错了。

3.7 Trace注解

可以用来监测方法执行时长,使用时类似这样:

 @Trace
private void testTrace(){ Observable.create(new ObservableOnSubscribe<String>() {
@Trace
@Override
public void subscribe(@NonNull ObservableEmitter<String> e) throws Exception { e.onNext("111"); }
}).subscribe(new Consumer<String>() { @Trace
@Override
public void accept(@NonNull String str) throws Exception { }
});
}

调用 testTrace 方法之后,在log 的 i 级别中,你可以看到这样的log



这里,我们就可以很清楚的看到每个方法的执行时间了。

四. 混淆

混淆的话,可以这样处理

-keep class com.safframework.aop.** { *; }
五. 项目结构图和效果图

项目结构图

效果图

AOP切面编程在android上的应用

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

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

AOP切面编程在android上的应用的更多相关文章

  1. Spring AOP 切面编程记录日志和接口执行时间

    最近客户现在提出系统访问非常慢,需要优化提升访问速度,在排查了nginx.tomcat内存和服务器负载之后,判断是数据库查询速度慢,进一步排查发现是因为部分视图和表查询特别慢导致了整个系统的响应时间特 ...

  2. 注解与AOP切面编程实现redis缓存与数据库查询的解耦

    一般缓存与数据库的配合使用是这样的. 1.查询缓存中是否有数据. 2.缓存中无数据,查询数据库. 3.把数据库数据插入到缓存中. 其实我们发现 1,3 都是固定的套路,只有2 是真正的业务代码.我们可 ...

  3. Spring MVC通过AOP切面编程 来拦截controller 实现日志的写入

    首选需要参考的是:[参考]http://www.cnblogs.com/guokai870510826/p/5977948.html    http://www.cnblogs.com/guokai8 ...

  4. SpringBoot2.0 基础案例(11):配置AOP切面编程,解决日志记录业务

    本文源码 GitHub地址:知了一笑 https://github.com/cicadasmile/spring-boot-base 一.AOP切面编程 1.什么是AOP编程 在软件业,AOP为Asp ...

  5. 十:SpringBoot-配置AOP切面编程,解决日志记录业务

    SpringBoot-配置AOP切面编程,解决日志记录业务 1.AOP切面编程 1.1 AOP编程特点 1.2 AOP中术语和图解 2.SpringBoot整合AOP 2.1 核心依赖 2.2 编写日 ...

  6. Spring AOP 切面编程的方法

    spring aop的使用分为两种,一种是使用注解来实现,一种是使用配置文件来实现. 先来简单的介绍一下这两种方法的实现,接下来详细的介绍各处的知识点便于查阅.目录如下: 1.基于注解实现spring ...

  7. Spring基础篇——Spring的AOP切面编程

    一  基本理解 AOP,面向切面编程,作为Spring的核心思想之一,度娘上有太多的教程啊.解释啊,但博主还是要自己按照自己的思路和理解再来阐释一下.原因很简单,别人的思想终究是别人的,自己的理解才是 ...

  8. SpringBoot 通过自定义注解实现AOP切面编程实例

    一直心心念的想写一篇关于AOP切面实例的博文,拖更了许久之后,今天终于着手下笔将其完成. 基础概念 1.切面(Aspect) 首先要理解‘切’字,需要把对象想象成一个立方体,传统的面向对象变成思维,类 ...

  9. Spring 框架基础(04):AOP切面编程概念,几种实现方式演示

    本文源码:GitHub·点这里 || GitEE·点这里 一.AOP基础简介 1.切面编程简介 AOP全称:Aspect Oriented Programming,面向切面编程.通过预编译方式和运行期 ...

随机推荐

  1. 《Linux命令、编辑器与shell编程》第三版 学习笔记---003 使用multibootusb

    1.下载文件https://codeload.github.com/mbusb/multibootusb-8.9.0.tar.gz,使用命令: tar xvf multibootusb-8.9.0.t ...

  2. VS MFC 改变AfxMessageBox标题 AFX_IDS_APP_TITLE

    其实这个标题在资源String Table里就能找到,查找AFX_IDS_APP_TITLE,在这里你就能轻而易举的改变标题了. 注意:有的工程的资源String Table里面没有添加AFX_IDS ...

  3. tcpreplay 流量拆分算法研究

    1.1  算法目的 现在网络架构一般是Client-Server架构,所以网络流量一般是分 C-S 和 S-C 两个方向.tcpdump等抓包工具获取的pcap包,两个流向的数据没有被区分.流量方向的 ...

  4. POCO C++ SOCKET

    // client program #include "Poco/Net/DatagramSocket.h" #include "Poco/Net/SocketAddre ...

  5. 引进js文件运行在浏览器上调试报文件找不到

    原因是jsp文件的路径和js文件不在同一目录下,用"../"将它们的路径配置在同一路径下或者在路径前面加上"<%= request.getContextPath() ...

  6. (1)C#工具箱-公共控件1

    公共控件 InitializeComponent() 先说下InitializeComponent()这个方法,它在form1.cs里调用这个方法对控件进行初始化,控件的方法要在这个方法之后,否则会因 ...

  7. TCC分布式事务的实现原理(转载 石杉的架构笔记)

    拜托,面试请不要再问我TCC分布式事务的实现原理![石杉的架构笔记] 原创: 中华石杉 目录 一.写在前面 二.业务场景介绍 三.进一步思考 四.落地实现TCC分布式事务 (1)TCC实现阶段一:Tr ...

  8. js部分的总结

    一.词法结构 1.区分大小写 2.注意//单行/*多行注释* 3.字面量(直接量 literal) 12 //数字 5.8 //小数 “hello” ‘hello’ true /js/gi  //正则 ...

  9. [POI2014]Little Bird

    题目大意: $n(n\le10^6)$个点排成一排,每个点有一个高度$h_i$,现在要从$1$号点跳到$n$号点,从$i$号点出发跳到的点$j$满足$i<j\le i+k$,若$h_j\ge h ...

  10. unity3d 网页游戏客户端工程构建方案

    将一个项目分为两个编辑环境,一个是editor,一个是target. editor只是策划人员拖拖拽拽编辑场景,打包时程序自动将每个场景资源打包生成一个XXX.unity3d文件,并最后生成一个场景配 ...