您的位置:首页 > 其它

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

2016-06-14 12:06 357 查看

详细链接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;
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  性能