动态代理(1,umeng 自定义事件的统计,2,非侵入式的性能测量方法 )

详细链接http://mp.weixin.qq.com/s?__biz=MzAwNjMxNjQzNA==&mid=2651150548&idx=1&sn=db7098637690371ed315c770216f945c&scene=1&srcid=0613LV1OPJHz2kiH6RVJMces#rd

一:实现思路:

1,创建InvocationHandler的实现类,如MyHandler,在接受传入进来的listener
2,重写invoke方法:参1:类加载器.参2,就是该实现类具体执行的方法,3,传入进来的参数(比如view)
3,在之前使用的界面上new出这个代理对象就可以,不需要new出系统自带的实现类

二:创建InvocationHandler的实现类

package com.lzyc.ybtappcal.handler;

import android.content.Context;
import android.view.View;
import com.lzyc.ybtappcal.R;
import com.umeng.analytics.MobclickAgent;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * Created by lovelin on 2016/6/14.
 * 扫描的动态代理
 */
public class CameraHandler implements InvocationHandler {


    private final View.OnClickListener listener;
    private Context mContext;


    public CameraHandler(View.OnClickListener listener, Context context) {
        this.listener = listener;
        this.mContext = mContext;

    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        Object o = null;
        //TopFragmentde 扫描自定义事件 camera_start
        //判断R.id.iv_fg_top的点击事件
        if (args.length != 0 && ((View) args[0]).getId() == (R.id.iv_fg_top)) {
            //自定义事件
            MobclickAgent.onEvent(mContext, "camera_start");
            o = method.invoke(listener, args);  //实质就是onClick方法

        }
        return o;
    }

    public View.OnClickListener create() {
        Object instance = Proxy.newProxyInstance(listener.getClass().getClassLoader(), listener.getClass().getInterfaces(), this);
        return (View.OnClickListener) instance;
    }

}

三:相对应界面的引用

//直接创建代理对象,出入相对应的参数就可以了

//动态代理,实现对扫面次数的监听(我的这个界面是fragment)
    private void initClick() {
        v.iv_fg_top.setOnClickListener(new CameraHandler(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //业务逻辑
                if (ReimbursementConstant.TOPCITY.equals(cityOpenedIs)) {
                    Bundle mBundle = new Bundle();
                    mBundle.putInt(Contants.KEY_PAGE_SEARCH, Contants.VAL_PAGE_SEARCH_TOP);
                    openActivity(LoddingSleepActivity.class, mBundle);

                } else {
                    popupCityList(FLAG_POPUPCITY_SHOW_OTHER);
                }
            }
        }, getActivity()).create());
    }

三:比如我在做umeng统计自定义事件,从而实现漏斗便于观察APP用户使用app时候转换率,我就是写了一个一半View的onClickLintener和ListView的OnItemListenner,通过构造函数传递不同的TAG,从而实现了,一个代理对象的多次使用,之后需要更改,直接在代理对象中操作就可以了,不用去看业务代码

1,这个是listview
  • ListView的OnItemClickListener点击事件的代理实现类
  • 通过tag来区分不同的View的点击事件从而自定义式umeng自定义事件统计数据
package com.lzyc.ybtappcal.handler;

import android.content.Context;
import android.widget.AdapterView;
import com.lzyc.ybtappcal.util.LogUtil;
import com.umeng.analytics.MobclickAgent;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * Created by lovelin on 2016/6/14.
 * <p>
 * ListView的OnItemClickListener点击事件的代理实现类
 * 通过tag来区分不同的View的点击事件从而自定义式umeng自定义事件统计数据
 *
 */
public class OnItemClickListeneHandler implements InvocationHandler {

    private AdapterView.OnItemClickListener ItemListener;
    private Context mContext;
    private String tag;

    public OnItemClickListeneHandler(AdapterView.OnItemClickListener ItemListener, Context mContext,String tag) {
        this.mContext = mContext;
        this.ItemListener = ItemListener;
        this.tag = tag;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        Object invoke = null;
        if(tag.equals("drugsListView")){
            //umeng自定义事件
            //搜索界面跳转到药品详情界面
            MobclickAgent.onEvent(mContext, "searth_start");
            //业务逻辑
            invoke = method.invoke(ItemListener, args);
            LogUtil.e("searth_start","searth_start"+"###searth_start_end");
        }
        return invoke;
    }

    public AdapterView.OnItemClickListener create() {
        Object o = Proxy.newProxyInstance(ItemListener.getClass().getClassLoader(), ItemListener.getClass().getInterfaces(), this);
        return (AdapterView.OnItemClickListener) o;
    }
}
2,这个是普通的view点击事件
  • (常见view的点击事件)
  • 通过tag来区分不同的listview的点击事件从而自定义式umeng自定义事件统计数据
package com.lzyc.ybtappcal.handler;

import android.content.Context;
import android.view.View;

import com.lzyc.ybtappcal.R;
import com.lzyc.ybtappcal.util.LogUtil;
import com.umeng.analytics.MobclickAgent;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * Created by lovelin on 2016/6/14.
 * (常见view的点击事件)
 * 通过tag来区分不同的listview的点击事件从而自定义式umeng自定义事件统计数据
 */
public class OnClickListenerHandler implements InvocationHandler {


    private final View.OnClickListener listener;
    private Context mContext;
    private String tag;

    public OnClickListenerHandler(View.OnClickListener listener, Context context, String tag) {
        this.listener = listener;
        this.mContext = mContext;
        this.tag = tag;

    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        Object o = null;
        //TopFragmentde 扫描自定义事件 camera_start
     /*   if (args.length != 0 && ((View) args[0]).getId() == (R.id.iv_fg_top)) {
            //自定义事件
            MobclickAgent.onEvent(mContext, "camera_start");
            o = method.invoke(listener, args);
        } else if (args.length != 0 && ((View) args[0]).getId() == (R.id.scan_reslut_detail)) {
            // LogUtil.e("drugdetail_start","drugdetail_start"+"drugdetail_start_befor");
            MobclickAgent.onEvent(mContext, "drugdetail_start");
            o = method.invoke(listener, args);

        }*/

        //TopFragmentde 扫描自定义事件 camera_start
        if (tag.equals("iv_fg_top")) {
            MobclickAgent.onEvent(mContext, "camera_start");
            o = method.invoke(listener, args);
            LogUtil.e("camera_start","camera_start"+"#camera_start_end");

        } else if (tag.equals("scan_reslut_detail")) {
          //自定义搜索界面进入药品详情界面
            MobclickAgent.onEvent(mContext, "drugdetail_start");
            o = method.invoke(listener, args);
            LogUtil.e("drugdetail_start","drugdetail_start"+"##drugdetail_start_end");
        }
        return o;
    }

    public View.OnClickListener create() {
        Object instance = Proxy.newProxyInstance(listener.getClass().getClassLoader(), listener.getClass().getInterfaces(), this);
        return (View.OnClickListener) instance;
    }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值