动态代理(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,在接受传入进来的listener2,重写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; } }
相关文章推荐
- 选定虚拟主机 性能凸显优势
- 修改一行代码提升 Postgres 性能 100 倍
- redis的hGetAll函数的性能问题(记Redis那坑人的HGETALL)
- 推荐Sql server一些常见性能问题的解决方法
- SQL Server误区30日谈 第9天 数据库文件收缩不会影响性能
- 和表值函数连接引发的性能问题分析
- SQLServer 2000 升级到 SQLServer 2008 性能之需要注意的地方之一
- 数据库性能优化三:程序操作优化提升性能
- VBS中的字符串连接的性能问题
- mysql 性能的检查和调优方法
- 数据库性能优化二:数据库表优化提升性能
- SQL语句性能优化(续)
- SQL语句优化提高数据库性能
- 如何用分表存储来提高性能 推荐
- ASP中使用FileSystemObject时提高性能的方法
- 如何改进javascript代码的性能
- JavaScript脚本性能优化注意事项
- 使用Function.apply()的参数数组化来提高 JavaScript程序性能的技巧
- JQuery Tips(4) 一些关于提高JQuery性能的Tips
- jQuery性能优化28条建议你值得借鉴