对于OKHttp的封装,现在已经有很多方法,甚至Retrofit也是基于OkHttp封装而来。本文的封装方式不一定是最好的,但相信在某一种场景下肯定能帮助你大大简化代码。

一个普通的请求如下,采用了链式调用,使得可读性大大增加。但是如果一个页面里面有多个请求,代码量也是多很多,而每次请求都要传递参数字段,假如某个字母错了也要回到相应的界面查找。这对于代码强迫症来说是有点接受不了的。

    OkHttpUtils.get().url(UrlAddress.GET_SCENIC_SPOTS).addHeader("authorization",GlobalParams.authorization).addParams("page","1").addParams("pageNum","99999").build().execute(new LiStringCallback() {@Overridepublic void onBefore(Request request, int id) {super.onBefore(request, id);//      showLoadingDialog("获取景区中");}@Overridepublic void onAfter(int id) {super.onAfter(id);//        hideLoadingDialog();}@Overridepublic void onError(Call call, Exception e, int i) {super.onError(call, e, i);}@Overridepublic void onResponse(String s, int i) {super.onResponse(s, i);Gson gson = new Gson();//景区列表SceneSpotListResult result = gson.fromJson(s, SceneSpotListResult.class);if (result.checkCode()){sceneList.clear();sceneList.addAll(result.getResult().getData());}}});}复制代码

简化思路如下,先创建OKHttp封装的接口监听LiOKHttpListen

/*** Created by li on 2018/4/10.* 这是OKHttp封装的接口监听*/public interface LiOKHttpListen {/*** 访问前* @param request  请求数据* @param requestType  操作类型*/void onHttpBefore(Request request,RequestType requestType);/*** 访问后* @param requestType 操作类型*/void onHttpAfter(RequestType requestType);/*** 出错* @param e  异常信息* @param requestType 操作类型*/void onHttpError(Exception e,RequestType requestType);/*** 成功* @param s 服务器返回数据* @param requestType 操作类型*/void onHttpResponse(String s,RequestType requestType);
}复制代码

再创建自定义的回调LiStringCallback

/*** Created by li on 2018/4/9.* 自定义回调* 对接口的回调统一在这里进行。*/public abstract class LiStringCallback extends StringCallback {//大帅比的接口private LiOKHttpListen liOKHttpListen;//大帅比的操作枚举类型private RequestType requestType;//普通构造方法public LiStringCallback() {}//带有接口的构造方法public LiStringCallback(LiOKHttpListen liOKHttpListen,RequestType requestType) {this.liOKHttpListen = liOKHttpListen;this.requestType = requestType;}//请求前操作@Overridepublic void onBefore(Request request, int id) {super.onBefore(request, id);if (liOKHttpListen != null) {liOKHttpListen.onHttpBefore(request,requestType);}}//请求结束后操作@Overridepublic void onAfter(int id) {super.onAfter(id);if (liOKHttpListen != null) {liOKHttpListen.onHttpAfter(requestType);}}//请求错误操作@Overridepublic void onError(Call call, Exception e, int i) {//提示网络异常MainApp.getInstance().showMsg(R.string.common_string_http_error);if (liOKHttpListen != null) {liOKHttpListen.onHttpError(e,requestType);}}//请求成功操作@Overridepublic void onResponse(String s, int i) {if (liOKHttpListen != null) {liOKHttpListen.onHttpResponse(s,requestType);}}
}
复制代码

设置不同操作的枚举类型,RequestType的作用是同个请求可能有不同的操作,需要对之进行区分

/*** Created by li on 2018/4/10.* 枚举类。包括需要进行的操作,用于判断不同操作*/public enum RequestType {GET_SCENE    // 获取景存放键值对数据的实体,仅方便数组请求/*** Created by li on 2018/4/10.* 存放键值对数据的实体*/public class LiKeyBean {//键名String keyName;//键值String keyValue;public LiKeyBean(String keyName, String keyValue) {this.keyName = keyName;this.keyValue = keyValue;}public String getKeyName() {return keyName;}public void setKeyName(String keyName) {this.keyName = keyName;}public String getKeyValue() {return keyValue;}public void setKeyValue(String keyValue) {this.keyValue = keyValue;}
}复制代码

最后是okhttp管理类

/*** Created by li on 2018/4/10.* 面对用户使用的方法,可用post等方法* 用户调用对应方法,并实现接口即可*/public class LiOKHttpUtil {/*** 用数据请求 post* @param listen 实现LiOKHttpListen接口的对象* @param url    链接* @param heads  请求头数组* @param params  参数数组* @param requestType  操作类型*/private static void post(LiOKHttpListen listen,String url,LiKeyBean[] heads, LiKeyBean[] params ,RequestType requestType){//获取buildPostFormBuilder postFormBuilder =  OkHttpUtils.post().url(url);//添加请求头if (heads!=null){for (int i=0;i<heads.length;i++){LiKeyBean keyBean = heads[i];if (keyBean==null) continue;postFormBuilder.addHeader(keyBean.getKeyName(),keyBean.getKeyValue());}}//添加请求if (params!=null){for (int i=0;i<params.length;i++){LiKeyBean keyBean = params[i];if (keyBean==null) continue;postFormBuilder.addParams(keyBean.getKeyName(),keyBean.getKeyValue());}}//请求postFormBuilder .build().execute(new LiStringCallback(listen,requestType) {@Overridepublic void onBefore(Request request, int id) {super.onBefore(request, id);}@Overridepublic void onAfter(int id) {super.onAfter(id);}@Overridepublic void onError(Call call, Exception e, int i) {super.onError(call, e, i);}@Overridepublic void onResponse(String s, int i) {super.onResponse(s, i);}});}/*** 用数据请求 get* @param listen 实现LiOKHttpListen接口的对象* @param url    链接* @param heads  请求头数组* @param params  参数数组* @param requestType  操作类型*/private static void get(LiOKHttpListen listen, String url,LiKeyBean[] heads, LiKeyBean[] params ,RequestType requestType){//获取buildGetBuilder getBuilder =  OkHttpUtils.get().url(url);//添加请求头if (heads!=null){for (int i=0;i<heads.length;i++){LiKeyBean keyBean = heads[i];if (keyBean==null) continue;getBuilder.addHeader(keyBean.getKeyName(),keyBean.getKeyValue());}}//添加请求if (params!=null){for (int i=0;i<params.length;i++){LiKeyBean keyBean = params[i];if (keyBean==null) continue;getBuilder.addParams(keyBean.getKeyName(),keyBean.getKeyValue());}}//请求getBuilder .build().execute(new LiStringCallback(listen,requestType) {@Overridepublic void onBefore(Request request, int id) {super.onBefore(request, id);}@Overridepublic void onAfter(int id) {super.onAfter(id);}@Overridepublic void onError(Call call, Exception e, int i) {super.onError(call, e, i);}@Overridepublic void onResponse(String s, int i) {super.onResponse(s, i);}});}/*** 用事先封装好的GetBuilder进行get请求* @param listen  实现LiOKHttpListen接口的对象* @param getBuilder 事先封装好的GetBuilder* @param requestType 操作类型*/private static void get(LiOKHttpListen listen,GetBuilder getBuilder ,RequestType requestType){//请求getBuilder.build().execute(new LiStringCallback(listen,requestType) {@Overridepublic void onBefore(Request request, int id) {super.onBefore(request, id);}@Overridepublic void onAfter(int id) {super.onAfter(id);}@Overridepublic void onError(Call call, Exception e, int i) {super.onError(call, e, i);}@Overridepublic void onResponse(String s, int i) {super.onResponse(s, i);}});}/*** 用事先封装好的PostFormBuilder进行post请求* @param listen  实现LiOKHttpListen接口的对象* @param postFormBuilder 事先封装好的PostFormBuilder* @param requestType 操作类型*/private static void post(LiOKHttpListen listen,PostFormBuilder postFormBuilder ,RequestType requestType){//请求postFormBuilder.build().execute(new LiStringCallback(listen,requestType) {@Overridepublic void onBefore(Request request, int id) {super.onBefore(request, id);}@Overridepublic void onAfter(int id) {super.onAfter(id);}@Overridepublic void onError(Call call, Exception e, int i) {super.onError(call, e, i);}@Overridepublic void onResponse(String s, int i) {super.onResponse(s, i);}});}/*** 获取景区* @param listen*/public static void getScenes(LiOKHttpListen listen,RequestType requestType) {GetBuilder getBuilder =  OkHttpUtils.get().url(UrlAddress.GET_SCENIC_SPOTS).addHeader("authorization",GlobalParams.authorization).addParams("page","1").addParams("string","99999");get(listen,getBuilder,requestType);}}复制代码

到这一步就可以在activity里面请求了

public class MainActivity extends BaseActivity implements LiOKHttpListen {@Overrideprotected int getLayoutId() {return R.layout.main_activity_main;}@Overrideprotected void initViews() {}@Overrideprotected void onDestroy() {}@Overrideprotected void initDatas() {getScenes();}@Overrideprotected void showContent() {}/*** 获取全部景区*/public void getScenes(){//一行代码就可以请求LiOKHttpUtil.getScenes(this,RequestType.GET_SCENE);}@Overridepublic void onHttpBefore(Request request, RequestType requestType) {switch (requestType){case GET_SCENE:showLoadingDialog("获取景区中");break;}}@Overridepublic void onHttpAfter(RequestType requestType) {//隐藏弹窗hideLoadingDialog();}@Overridepublic void onHttpError(Exception e, RequestType requestType) {}@Overridepublic void onHttpResponse(String s, RequestType requestType) {switch (requestType){case GET_SCENE://获取成功后的操作break;}}}复制代码

通过以上操作就实现了笔者想要的目的,总结如下 1.抛弃了原本单个请求就可以看到全部处理的可读性,改成了全部请求通过接口返回,适用于大部分对除response之外操作不多或者重复的请求 2.将所有请求的大任都交给了LiOkHttpUtil的工具类,方便对请求管理

OkHttp简化请求封装思路相关推荐

  1. OKHttp网络请求封装

    导入依赖 compile 'com.zhy:okhttputils:2.0.0' ----------------------------------------------------------- ...

  2. Android OkHttp+Retrofit+Rxjava+Hilt 的网络请求封装

    今天给大家简单的封装一个现在比较流行的网络请求框架 第一步是导入我们所需要的依赖还需要在android {}闭包下添加一个 buildFeatures{viewBinding true } imple ...

  3. Okhttp同步请求源码分析

    进阶android,OKhttp源码分析--同步请求的源码分析 OKhttp是我们经常用到的框架,作为开发者们,我们不单单要学会灵活使用,还要知道他的源码是如何设计的. 今天我们来分析一下OKhttp ...

  4. Spring Boot + Vue 前后端分离开发,前端网络请求封装与配置

    前端网络访问,主流方案就是 Ajax,Vue 也不例外,在 Vue2.0 之前,网络访问较多的采用 vue-resources,Vue2.0 之后,官方不再建议使用 vue-resources ,这个 ...

  5. Android中使用logger打印完整的okhttp网络请求和响应的所有相关信息(请求行、请求头、请求体、响应行、响应行、响应头、响应体)

    如果你的项目中的网络请求库是Retrofit的话,他的底层封装的是OkHttp,通常调试网络接口时都会将网络请求和响应相关数据通过日志的形式打印出来.OkHttp也提供了一个网络拦截器okhttp-l ...

  6. jquery ajax请求封装 (promise)

    在进入正文前先来一段小插曲: 封装ajax请求主要的目的在于减少冗余代码,而ajax请求的主要作用就是数据请求,那么数据处理就尤为重要了,那么怎样在封装的请求里面实现针对不同业务逻辑.不同数据结构等的 ...

  7. 详解 Android okhttp 网络请求get,post传输数据的基本用法

    官网网址:http://square.github.io/okhttp/ github地址:https://github.com/square/okhttp OKHttp优点 1.支持HTTP2/SP ...

  8. 微信小程序请求封装及案例展示

    在微信小程序中必然需要用到请求的封装,简化代码,便于整理,那怎样进行封装请求呢? 一.app.js文件(用于请求地址的整理) module.exports = {memberSearch: '/wel ...

  9. ajax请求封装,封装的ajax请求

    在做登录注册这类提交表单数据时,我们经常需要局部刷新网页来验证用户输入的信息,这就需要用到ajax请求,我们通常需要获取表单中的数据,发起ajax请求,通过服务程序,与数据库的数据进行比对,判断信息的 ...

最新文章

  1. FragmentPagerAdapter 与 FragmentStatePagerAdapter 的区别
  2. 解决yum安装时 Cannot retrieve repository metadata (repomd.xml) for repository
  3. Java web程序中备份oracle数据库
  4. HDU.5909.Tree Cutting(树形DP FWT/点分治)
  5. Python异步编程Async/Await
  6. PHP 利用Mail_MimeDecode类提取邮件信息
  7. mysql join越多性能_mysqljoin的原理和优化
  8. EasyUI datagrid增加统计当前页中某列的最大值,最小值,平均值,总和
  9. c语言课程设计报告 数独,C语言课程设计报告数独.pdf
  10. 金山要剥离WPS词霸等,会不会是Google的一大阴谋?!
  11. ILSVRC2012(ImageNet2012)数据集的下载及ILSVRC2012_img_val数据集的分类
  12. PHP中用while的用法,php while语句的用法
  13. 【期刊推荐】JCR2区数学算法优化类重点SCI期刊征稿中~
  14. 特征向量和特征值的物理意义
  15. 汇智动力学员最新就业喜报,最高薪资16K!
  16. android 程序题期末,Android应用开发期末考试题
  17. 三类最常用的数据分析工具,你用过哪一类?
  18. 万得数据写入Excel
  19. Springboot注解@ServletComponentScan和@ComponentScan
  20. 基于Java+SpringBoot+Thymeleaf+Mysql在线教育视频点播学习系统设计与实现

热门文章

  1. 畅捷通t+标准版操作手册_外网IP访问畅捷通T+教程
  2. dat文件读取_微信dat文件如何查看
  3. 通过堡垒机rdp 黑屏_[调优]彻底解决RDP连接过程缓慢的问题
  4. Android开源项目
  5. Premiere Pro CS5软件安装教程
  6. mysql profile 查谒_MYSQL查询优化:profile功能
  7. linux vi 是目录,linux基本操作之目录、vi等
  8. arrays中copyof复制两个数组_数组,及二维数组
  9. xctf php2,XCTF PHP2
  10. java中javamail收发邮件实现方法