利用动态代理+注解 实现子线程中执行方法

要实现的功能:
这里有一个类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();
        }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值