要实现的功能:
这里有一个类MySubject,我希望MySubject类中的方法凡是带@AsynMethod注解的方法都用子线程进行处理,无@AsynMethod注解都正常在主线程中执行即可如下图:
思路:使用自定义注解+动态代理
实现此功能所需的知识:
注解的基础知识:自定义注解入门
动态代理的官方文档:ProxyBuilder的用法
主要代码:
注解的实现代码:
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface AsyncMethod {
String myParam() default "I am parameter one";
boolean withDialog() default false;
}
动态代理的实现代码:
public class ProxyUtils {
private final static String TAG = "Class:ProxyUtils";
/**
* Created by gw on 2015/11/13.
*/
public static <T> T dynamicProxy(Context context, Class<T> clazz) throws Throwable {
InvocationHandler handler = new InvocationHandler() {
Object result;
@Override
public Object invoke(final Object proxy, final Method method, final Object[] args) {
final AsyncMethod asyncMethod = method.getAnnotation(AsyncMethod.class);
if (asyncMethod == null) {
try {
Log.d(TAG, "无注解," + Thread.currentThread().getName() + "线程");
result = ProxyBuilder.callSuper(proxy, method, args);
} catch (Throwable e) {
}
} else {
Executors.newCachedThreadPool().execute(new Runnable() {
@Override
public void run() { android.os.Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);
try {
Log.d(TAG, "有注解," + Thread.currentThread().getName()
+ "线程,注解参数为--->myParam:" + asyncMethod.myParam()
+ ",withDialog:" + asyncMethod.withDialog());
result = ProxyBuilder.callSuper(proxy, method, args);
} catch (Throwable e) {
}
}
});
}
return result;
}
};
T proxyObj = ProxyBuilder.forClass(clazz)
.dexCache(context.getDir(getVersionCode(context) + "", Context.MODE_PRIVATE)).
handler(handler).build();
return proxyObj;
}
private static int getVersionCode(Context context) throws IOException {
int version = 0;
try { // 获取packagemanager的实例
PackageManager packageManager = context.getPackageManager();
// getPackageName()是你当前类的包名,0代表是获取版本信息
PackageInfo packInfo = packageManager.getPackageInfo(context.getPackageName(), 0);
version = packInfo.versionCode;
} catch (Exception exception) {
}
return version;
}
}
被代理的对象的实现代码:
public class MySubject {
private final String TAG = "Class:MySubject";
@AsyncMethod
public void rent() {
Log.d(TAG, "执行了rent方法");
}
public void hello() {
Log.d(TAG, "执行了执行了hello方法方法");
}
@AsyncMethod(myParam = "test",withDialog = true)
public void execute() {
Log.d(TAG, "执行了执行了hello方法方法");
}
生成被动态代理的类的对象,使用动态代理的实现代码:
MySubject mySubject;
try {
mySubject =ProxyUtils.dynamicProxy(this, MySubject.class);
mySubject.hello();
mySubject.rent();
mySubject.execute();
} catch (Throwable throwable) {
throwable.printStackTrace();
}