Android网络拦截器,支持Debug模式,查看请求与响应的具体信息并修改
来源:互联网 发布:淘宝拍下宝贝如何发货 编辑:程序博客网 时间:2024/06/05 03:10
上班的某天,导师突然对我说要做一个网络拦截器
网络拦截器,顾名思义就是用于拦截网络的,可以获得 http请求的具体信息,如请求头,URL,请求体,响应体,请求方法等,
一开始万脸懵逼,根本就没接触过这么高深的东西,于是各种百度,一无所获,看来是没人做过类似的插件。
于是师傅提供了一个思路,OkHttp有一个Interceptor 用于拦截网络,修改请求等,了解之后就开始做了
前期准备:全局悬浮窗,跟随应用一起消亡;一个界面,用于展示网络请求信息;
项目中涉及的知识比较多,比如Service,windowmanager,recyclerview,okhttpinterceptor,数据的存储等 下面将一个个细说
先看图,黄色的小点就是悬浮窗,全局存在,因此用到了bindService
要实现全局的悬浮窗,自然用到了Service,后台一直存在,将生成的界面展示再Window上,
这里用到了WindowManager 和Service,通过layoutinfalte加载自定义的界面,然后通过windowmanager.addView()把自定义布局加载到window中,至于点击事件什么的,很简单
private void initSwitchWindow() { switchParams = new WindowManager.LayoutParams( WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.TYPE_PHONE, WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, PixelFormat.TRANSLUCENT); switchParams.gravity = Gravity.START | Gravity.TOP; switcherWindow = LayoutInflater.from(this) .inflate(R.layout.interceptor_switch_btn, null); mWindowManager.addView(switcherWindow, switchParams); pgbNetWorking = (ProgressBar) switcherWindow.findViewById(R.id.pgb_on_working); tvProgress = (TextView) switcherWindow.findViewById(R.id.tv_progress); switcherWindow.setOnTouchListener(new SwitchOnTouchListener(switcherWindow, mWindowManager)); switcherWindow.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (networkWindow == null) { initNetWorkWindow(); showLog(); } else if (!isLogShow) { showLog(); } else { closeLog(); } } }); switcherWindow.setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View v) { if (checkFunctionWindow == null) { initCheckedDetailWindow(); showFunctionWindow(); } else if (!isCheckFunctionShow) { showFunctionWindow(); } Log.i("tag", "-----onlongclick"); return true; } }); }悬浮窗初始化好了之后 就是点击后展示的界面,这里用到了RecyclerView,点击后出现子View
这里的recyclerview将会通过getItemViewType来设置,在bindviewHolder的时候 判断传入的viewholder属于是什么类型,从而展示相应信息
/** * d * 适配器用于将网络拦截器中的信息展示到RecyclerView上 * Created by HongChen on 2017/11/8. */public class LogAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { private List<HttpVO> realHttpVOS = new ArrayList<>(); private List<HttpVO> showHttpVOS = new ArrayList<>(); private OnItemClickListener onItemClickListener; public interface OnItemClickListener { boolean onLongClick(View v, int position); } public void setOnItemLongClickListener(OnItemClickListener onItemClickListener) { this.onItemClickListener = onItemClickListener; } @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { /* 点击父布局出现详细信息 */ if (viewType == HttpVO.TYPE_TITLE) { View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.parentview_layout, parent, false); return new ParentViewHolder(view); } else { View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.childview_layout, parent, false); return new ChildViewHolder(view); } } @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { final HttpVO httpVO = showHttpVOS.get(position); if (holder instanceof ParentViewHolder) { String title = "Url:" + httpVO.content; ((ParentViewHolder) holder).title.setText(title); } else if (holder instanceof ChildViewHolder) { ((ChildViewHolder) holder).content.setText(httpVO.content); ((ChildViewHolder) holder).content.setTag(httpVO.position); } } @Override public int getItemCount() { return showHttpVOS.size(); } @Override public int getItemViewType(int position) { return showHttpVOS.get(position).type; } public void addData(List<HttpVO> data) { realHttpVOS.addAll(data); showHttpVOS.add(data.get(0)); notifyItemInserted(showHttpVOS.size() - 1); } /** * 清空所有数据 */ public void clearData() { realHttpVOS.clear(); showHttpVOS.clear(); notifyDataSetChanged(); } public List<HttpVO> getDataList() { return realHttpVOS; } class ParentViewHolder extends RecyclerView.ViewHolder { TextView title; ParentViewHolder(View itemView) { super(itemView); title = (TextView) itemView.findViewById(R.id.tv_title); itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { final int position = getAdapterPosition(); final HttpVO httpVO = showHttpVOS.get(position); final boolean isExpand = httpVO.isExpand(); httpVO.setExpand(!isExpand); final int nextPosition = position + 1; if (isExpand) { showHttpVOS.remove(nextPosition); notifyItemRemoved(nextPosition); } else { showHttpVOS.add(nextPosition, realHttpVOS.get(httpVO.position + 1)); notifyItemInserted(nextPosition); } } }); } } class ChildViewHolder extends RecyclerView.ViewHolder { TextView content; RelativeLayout rlVerifyRequestData; EditText etUpdate; Button btnVerify; ChildViewHolder(final View itemView) { super(itemView); content = (TextView) itemView.findViewById(R.id.tv_content); rlVerifyRequestData = (RelativeLayout) itemView.findViewById(R.id.rl_verify_requestdata); etUpdate = (EditText) itemView.findViewById(R.id.et_verifydata); btnVerify = (Button) itemView.findViewById(R.id.btn_updata); content.setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View v) { Log.i("tag", "----------onLongClick"); return onItemClickListener != null && onItemClickListener.onLongClick(v, (Integer) v.getTag()); } }); } }}先写这点,要上班了
阅读全文
0 0
- Android网络拦截器,支持Debug模式,查看请求与响应的具体信息并修改
- nginx 拦截请求信息与响应信息并切割日志
- android,retrofit,okhttp,日志拦截器,使用拦截器Interceptor统一打印请求与响应的json
- axios的拦截请求与响应
- Android中WebView中拦截所有请求并替换URL(支持AJAX的post请求类型)
- iphone网络请求与响应,并对响应的xml进行处理
- 过滤器与拦截器的具体区别
- 过滤器与拦截器的具体区别
- 过滤器与拦截器的具体区别
- 过滤器与拦截器的具体区别
- Android----OKHttp网络请求-拦截器
- Android OkHttp网络请求拦截器
- 使用拦截器获取请求参数信息并写入日志
- retrofit2.0使用拦截器Interceptor统一打印请求与响应的json
- retrofit2.0使用拦截器Interceptor统一打印请求与响应的json
- mysql查看是否支持分区以及查看具体某一表的详细分区信息情况
- wget/curl查看请求响应头信息
- 简单的网络请求拦截器
- Python新手-点击登录页面的登录按钮,如何跳转到指定的页面:
- Remote Service使用之IPC
- 【XML】验证器
- js中sort总结
- C语言编程:求n的阶乘问题。输入一个正整数n,输出n!
- Android网络拦截器,支持Debug模式,查看请求与响应的具体信息并修改
- 自定义UICollectionView+HeaderView
- mysql--16310子查询
- github搭建个人博客----------绑定域名访问
- Netty源码解读(四)Netty与Reactor模式
- Android将apk转换成二维码提供给别人扫描并下载
- TabLayout的使用
- 读《文艺复兴三杰,拉斐尔》
- Ubuntu系统初步安装优化