okHttp介绍

通过上面的对比说明,让你不得不做出明智的选择,OkHttp是一个相对成

官网地址:http://square.github.io/okhttp/

官方API地址:http://m.blog.csdn.net/article/details?id=50747352

github源码地址:https://github.com/square/okhttp

Android OkHttp(一)源码出发探寻执行原理

okHttp主要类

1.)OkHttpClient.java

2.)Request.java

3.)Call.java

4.)RequestBody.java

5.)Response.java

添加引用 build.gradle添加如下

compile 'com.squareup.okhttp3:okhttp:3.2.0'

二次封装管理类

(一)RequestManager.java 全局属性解说

 private static final MediaType MEDIA_TYPE_JSON = MediaType.parse("application/x-www-form-urlencoded; charset=utf-8");//mdiatype 这个需要和服务端保持一致private static final MediaType MEDIA_TYPE_MARKDOWN = MediaType.parse("text/x-markdown; charset=utf-8");//mdiatype 这个需要和服务端保持一致private static final String TAG = RequestManager.class.getSimpleName();private static final String BASE_URL = "http://xxx.com/openapi";//请求接口根地址private static volatile RequestManager mInstance;//单利引用public static final int TYPE_GET = 0;//get请求public static final int TYPE_POST_JSON = 1;//post请求参数为jsonpublic static final int TYPE_POST_FORM = 2;//post请求参数为表单private OkHttpClient mOkHttpClient;//okHttpClient 实例private Handler okHttpHandler;//全局处理子线程和M主线程通信

(二)RequestManager.java 构造函数

 /*** 初始化RequestManager*/public RequestManager(Context context) {//初始化OkHttpClientmOkHttpClient = new OkHttpClient().newBuilder().connectTimeout(10, TimeUnit.SECONDS)//设置超时时间.readTimeout(10, TimeUnit.SECONDS)//设置读取超时时间.writeTimeout(10, TimeUnit.SECONDS)//设置写入超时时间.build();//初始化HandlerokHttpHandler = new Handler(context.getMainLooper());}

(三)RequestManager.java 获取单利引用 这里用到了双重检查锁实现单例

   /*** 获取单例引用** @return*/public static RequestManager getInstance(Context context) {RequestManager inst = mInstance;if (inst == null) {synchronized (RequestManager.class) {inst = mInstance;if (inst == null) {inst = new RequestManager(context.getApplicationContext());mInstance = inst;}}}return inst;}

(四)管理同步请求统一入口

 /***  okHttp同步请求统一入口* @param actionUrl  接口地址* @param requestType 请求类型* @param paramsMap   请求参数*/public void requestSyn(String actionUrl, int requestType, HashMap<String, String> paramsMap) {switch (requestType) {case TYPE_GET:requestGetBySyn(actionUrl, paramsMap);break;case TYPE_POST_JSON:requestPostBySyn(actionUrl, paramsMap);break;case TYPE_POST_FORM:requestPostBySynWithForm(actionUrl, paramsMap);break;}}

(1)同步get请求

/*** okHttp get同步请求* @param actionUrl  接口地址* @param paramsMap   请求参数*/private void requestGetBySyn(String actionUrl, HashMap<String, String> paramsMap) {StringBuilder tempParams = new StringBuilder();try {//处理参数int pos = 0;for (String key : paramsMap.keySet()) {if (pos > 0) {tempParams.append("&");}//对参数进行URLEncodertempParams.append(String.format("%s=%s", key, URLEncoder.encode(paramsMap.get(key), "utf-8")));pos++;}//补全请求地址String requestUrl = String.format("%s/%s?%s", BASE_URL, actionUrl, tempParams.toString());//创建一个请求Request request = addHeaders().url(requestUrl).build();//创建一个Callfinal Call call = mOkHttpClient.newCall(request);//执行请求final Response response = call.execute();response.body().string();} catch (Exception e) {Log.e(TAG, e.toString());}}

(2)同步post请求

/*** okHttp post同步请求* @param actionUrl  接口地址* @param paramsMap   请求参数*/private void requestPostBySyn(String actionUrl, HashMap<String, String> paramsMap) {try {//处理参数StringBuilder tempParams = new StringBuilder();int pos = 0;for (String key : paramsMap.keySet()) {if (pos > 0) {tempParams.append("&");}tempParams.append(String.format("%s=%s", key, URLEncoder.encode(paramsMap.get(key), "utf-8")));pos++;}//补全请求地址String requestUrl = String.format("%s/%s", BASE_URL, actionUrl);//生成参数String params = tempParams.toString();//创建一个请求实体对象 RequestBodyRequestBody body = RequestBody.create(MEDIA_TYPE_JSON, params);//创建一个请求final Request request = addHeaders().url(requestUrl).post(body).build();//创建一个Callfinal Call call = mOkHttpClient.newCall(request);//执行请求Response response = call.execute();//请求执行成功if (response.isSuccessful()) {//获取返回数据 可以是String,bytes ,byteStreamLog.e(TAG, "response ----->" + response.body().string());}} catch (Exception e) {Log.e(TAG, e.toString());}}

(3)同步post提交表单

/*** okHttp post同步请求表单提交* @param actionUrl 接口地址* @param paramsMap 请求参数*/private void requestPostBySynWithForm(String actionUrl, HashMap<String, String> paramsMap) {try {//创建一个FormBody.BuilderFormBody.Builder builder = new FormBody.Builder();for (String key : paramsMap.keySet()) {//追加表单信息builder.add(key, paramsMap.get(key));}//生成表单实体对象RequestBody formBody = builder.build();//补全请求地址String requestUrl = String.format("%s/%s", BASE_URL, actionUrl);//创建一个请求final Request request = addHeaders().url(requestUrl).post(formBody).build();//创建一个Callfinal Call call = mOkHttpClient.newCall(request);//执行请求Response response = call.execute();if (response.isSuccessful()) {Log.e(TAG, "response ----->" + response.body().string());}} catch (Exception e) {Log.e(TAG, e.toString());}}

(五)管理异步请求统一入口

/*** okHttp异步请求统一入口* @param actionUrl   接口地址* @param requestType 请求类型* @param paramsMap   请求参数* @param callBack 请求返回数据回调* @param <T> 数据泛型**/public <T> Call requestAsyn(String actionUrl, int requestType, HashMap<String, String> paramsMap, ReqCallBack<T> callBack) {Call call = null;switch (requestType) {case TYPE_GET:call = requestGetByAsyn(actionUrl, paramsMap, callBack);break;case TYPE_POST_JSON:call = requestPostByAsyn(actionUrl, paramsMap, callBack);break;case TYPE_POST_FORM:call = requestPostByAsynWithForm(actionUrl, paramsMap, callBack);break;}return call;}

(1)异步Get提交表单

  /*** okHttp get异步请求* @param actionUrl 接口地址* @param paramsMap 请求参数* @param callBack 请求返回数据回调* @param <T> 数据泛型* @return*/private <T> Call requestGetByAsyn(String actionUrl, HashMap<String, String> paramsMap, final ReqCallBack<T> callBack) {StringBuilder tempParams = new StringBuilder();try {int pos = 0;for (String key : paramsMap.keySet()) {if (pos > 0) {tempParams.append("&");}tempParams.append(String.format("%s=%s", key, URLEncoder.encode(paramsMap.get(key), "utf-8")));pos++;}String requestUrl = String.format("%s/%s?%s", BASE_URL, actionUrl, tempParams.toString());final Request request = addHeaders().url(requestUrl).build();final Call call = mOkHttpClient.newCall(request);call.enqueue(new Callback() {@Overridepublic void onFailure(Call call, IOException e) {failedCallBack("访问失败", callBack);Log.e(TAG, e.toString());}@Overridepublic void onResponse(Call call, Response response) throws IOException {if (response.isSuccessful()) {String string = response.body().string();Log.e(TAG, "response ----->" + string);successCallBack((T) string, callBack);} else {failedCallBack("服务器错误", callBack);}}});return call;} catch (Exception e) {Log.e(TAG, e.toString());}return null;}

(2)异步POST提交表单

/*** okHttp post异步请求* @param actionUrl 接口地址* @param paramsMap 请求参数* @param callBack 请求返回数据回调* @param <T> 数据泛型* @return*/private <T> Call requestPostByAsyn(String actionUrl, HashMap<String, String> paramsMap, final ReqCallBack<T> callBack) {try {StringBuilder tempParams = new StringBuilder();int pos = 0;for (String key : paramsMap.keySet()) {if (pos > 0) {tempParams.append("&");}tempParams.append(String.format("%s=%s", key, URLEncoder.encode(paramsMap.get(key), "utf-8")));pos++;}String params = tempParams.toString();RequestBody body = RequestBody.create(MEDIA_TYPE_JSON, params);String requestUrl = String.format("%s/%s", BASE_URL, actionUrl);final Request request = addHeaders().url(requestUrl).post(body).build();final Call call = mOkHttpClient.newCall(request);call.enqueue(new Callback() {@Overridepublic void onFailure(Call call, IOException e) {failedCallBack("访问失败", callBack);Log.e(TAG, e.toString());}@Overridepublic void onResponse(Call call, Response response) throws IOException {if (response.isSuccessful()) {String string = response.body().string();Log.e(TAG, "response ----->" + string);successCallBack((T) string, callBack);} else {failedCallBack("服务器错误", callBack);}}});return call;} catch (Exception e) {Log.e(TAG, e.toString());}return null;}

(3)异步POST提交表单

 /*** okHttp post异步请求表单提交* @param actionUrl 接口地址* @param paramsMap 请求参数* @param callBack 请求返回数据回调* @param <T> 数据泛型* @return*/private <T> Call requestPostByAsynWithForm(String actionUrl, HashMap<String, String> paramsMap, final ReqCallBack<T> callBack) {try {FormBody.Builder builder = new FormBody.Builder();for (String key : paramsMap.keySet()) {builder.add(key, paramsMap.get(key));}RequestBody formBody = builder.build();String requestUrl = String.format("%s/%s", BASE_URL, actionUrl);final Request request = addHeaders().url(requestUrl).post(formBody).build();final Call call = mOkHttpClient.newCall(request);call.enqueue(new Callback() {@Overridepublic void onFailure(Call call, IOException e) {failedCallBack("访问失败", callBack);Log.e(TAG, e.toString());}@Overridepublic void onResponse(Call call, Response response) throws IOException {if (response.isSuccessful()) {String string = response.body().string();Log.e(TAG, "response ----->" + string);successCallBack((T) string, callBack);} else {failedCallBack("服务器错误", callBack);}}});return call;} catch (Exception e) {Log.e(TAG, e.toString());}return null;}

(六)ReqCallBack

public interface ReqCallBack<T> {/*** 响应成功*/void onReqSuccess(T result);/*** 响应失败*/void onReqFailed(String errorMsg);
}

(七)添加请求头

/*** 统一为请求添加头信息* @return*/private Request.Builder addHeaders() {Request.Builder builder = new Request.Builder().addHeader("Connection", "keep-alive").addHeader("platform", "2").addHeader("phoneModel", Build.MODEL).addHeader("systemVersion", Build.VERSION.RELEASE).addHeader("appVersion", "3.2.0");return builder;}

(七)成功回调

 /*** 统一同意处理成功信息* @param result* @param callBack* @param <T>*/private <T> void successCallBack(final T result, final ReqCallBack<T> callBack) {okHttpHandler.post(new Runnable() {@Overridepublic void run() {if (callBack != null) {callBack.onReqSuccess(result);}}});}

(七)失败回调

/*** 统一处理失败信息* @param errorMsg* @param callBack* @param <T>*/private <T> void failedCallBack(final String errorMsg, final ReqCallBack<T> callBack) {okHttpHandler.post(new Runnable() {@Overridepublic void run() {if (callBack != null) {callBack.onReqFailed(errorMsg);}}});}

完。

Android Okhttp3 (二) 二次封装请求管理类相关推荐

  1. Android自己搭建一个实用的SharedPreferences管理类

    前言 在项目中经常会用到SharedPreferences来存储一些配置信息,比如用户的账号信息等.但是当项目大了之后如果还在要使用时再单独创建和使用SharedPreferences就会造成Shar ...

  2. android mvp框架基类,Android MVP架构项目搭建封装,基类封装

    综述 对于MVP (Model View Presenter)架构是从著名的MVC(Model View Controller)架构演变而来的.而对于Android应用的开发中本身可视为一种MVC架构 ...

  3. android网络请求线程池,利用线程池实现Android客户端的http网络数据请求工具类

    该工具类值只实现了HTTP的get方法,参考get方法可轻松实现post.put.delete等方法,下面是get方法的实现 public class SimpleHttpClient { priva ...

  4. [Android] DownloadManager下载管理类2.3新增API介绍

    从Android 2.3开始新增了一个下载管理类,在SDK的文档中我们查找android.app.DownloadManager可以看到.下载管理类可以长期处理多个HTTP下载任务,客户端只需要给出请 ...

  5. Android Tencent X5 WebView 集成封装

    Android Tencent X5 WebView 集成封装 Cookie管理.进度监听.适配8.1系统等策略 这篇文章的目标就是怎么样快速封装X5WebView,如何有效的同步以及管理Cookie ...

  6. 管理类联考可以用计算机吗,管理类联考

    基本信息 中文名 管理类联考 外文名 无 定    义 管理类专业硕士入学统一考试专业数量 七个专业学位 考试科目 管理类综合能力.英语二 起始时间 1997年 管理类联考相关概念 编辑 语音 1.& ...

  7. 社会化登录分享-Android SDK的二次封装和使用

    本系列文章将第三方的登录分享功能进行二次封装,统一接口调用,简化了接不同平台登录分享的步骤. 0 系列文章 系列一 Android SDK的二次封装和使用 系列二 源码解析 系列三 微信SDK接入 系 ...

  8. 疯狂Android讲义(二)——第二部分:第1组UI组件(布局管理器)

    一.第1组UI组件:布局管理器 Android 的界面组件比较多,不利于掌握它们内在的关系.为了帮助读者更好地掌握Android界面组件的关系,本书将会把这些界面组件按照它们的关联分析,分为几组进行介 ...

  9. retrofit框架学习(二)----retrofit封装

    retrofit 的封装 前言 上一篇文章的链接 http://blog.csdn.net/qq_26296197/article/details/78011188 1 上一篇文章讲到Retrofit ...

最新文章

  1. TCP编程函数和步骤
  2. HTTP over QUIC重命名为“HTTP / 3”协议
  3. python使用指南(part1)--去重
  4. cmd imp导入dmp文件_这是一篇长篇入门级数据库讲解:oracle数据库数据导入导出步骤...
  5. python扫雷游戏课程设计小组任务计划与分配表_python实现扫雷游戏
  6. 基于RDMA高速网络的高性能分布式系统
  7. Android 系统(275)---紧急号码的管理及客制化方法
  8. BestCoder4 1002 Miaomiao's Geometry (hdu 4932) 解题报告
  9. excel 异常来自 HRESULT:0x80010105 (RPC_E_SERVERFAULT)
  10. 核心网upf作用_核心网“入门级”科普,你看了没?
  11. spring5源码-基于XML的依赖注入
  12. java中的criteria_java-jpa-criteriaBuilder使用入门
  13. 【文献阅读笔记】(1):一篇手把手教你做GWAS的Guideline文献解读
  14. 51.N皇后 (力扣leetcode) 博主可答疑该问题
  15. 暴风影音5【版本:5.36.0428.1111】---给您影院般的“极致”体验
  16. java开发入行真功夫pdf_Visual C++开发入行真功夫
  17. java毕设答辩准备
  18. oracle同义词表不存在,同义词什么时候失效呢?
  19. MySQL数据库的完美卸载
  20. 2020汽车驾驶员(中级)证考试及汽车驾驶员(中级)操作证考试

热门文章

  1. 一些非Windows系的语言,工具介绍
  2. 如何利用南方CASS制作地形图
  3. 苹果为降频门道歉,品胜为2亿苹果用户省百亿美金
  4. matlab simulink 算例,MATLAB/Simulink官方文档
  5. 微信聊天记录怎么导出
  6. 【瑞吉外卖】day07:新增套餐、套餐分页查询、 删除套餐
  7. Unity 屏幕特效 之 简单地调整颜色的亮度、饱和度、对比度
  8. 编辑字体、合并单元格
  9. C 语言重来29:例题赏析——给定条件的整数集
  10. Istio一之Envoy工作原理