一、简介

Android系统提供了两种HTTP通信类:HttpURLConnection和HttpClient,前者对比后者十分难用。
网络请求进化:HttpURLConnection --- Apache HttpClient --- Volley ---OKHttp
volley是google官方提供的网络请求框架,它依赖于httpclient,而在Android6.0的sdk中去掉了httpclient,因而okhttp更受欢迎。
从Android4.4开始HttpURLConnection的底层实现采用的是okHttp 

二、特点

  • 一般的get请求
  • 一般的post请求
  • 基于Http的文件上传
  • 文件下载
  • 加载图片
  • 支持请求回调,直接返回对象、对象集合
  • 支持session的保持
  • 支持自签名网站https的访问,提供方法设置下证书就行
  • 支持取消某个请求

三、OKHTTP的基本使用

1 引入依赖
compile 'com.squareup.okhttp3:okhttp:3.7.0'
2 使用前,认识一下核心类
  • OKHttpClient 客户端对象
  • Request是OKHttp中的请求,post请求中需要包含RequestBody
  • Build是辅助类,用于生产对象
  • Response是OKHttp中的响应,响应中可以得到返回是否成功,返回数据
  • RequestBody请求数据,在Post请求中用到
  • client.newCall(request).execute()同步请求
  • client.newCall(request).enqueue(CallBack callback)异步请求,但是CallBack里面的代码实在子线程执行的,因此不能更新UI。需要配合Handle使用,更新UI。
3 基本使用步骤

3.1 创建OKHttpClient对象,官方推荐单例。

3.2 创建Request对象,这个对象是请求对象,需要指定URL。

如果是post请求,需要通过FormEncodingBuilder创建RequestBody对象,指定post传进去的参数。get不需要。

3.3 调用okhttpClient的newCall(request).enqueue(CallBack callback)或者execute方法。在callback的回调onResonse函数里做你需要做的事情。onResponse在子线程执行,如需更新UI,配合handler使用。

enqueue是异步请求,有回调接口,execute是同步请求,没有回调接口。一般使用异步请求。

四、基础封装

public class OKHttpHelper {

    private static OKHttpHelper mHelper = null;
private static OkHttpClient mClient = null;
private Handler mHandler; /**
* 私有构造函数
*/
private OKHttpHelper() {
// 没有响应时使用超时结束call。没有响应的原因可能是客户点链接问题、服务器可用性问题或者这之间的其他东西。
mClient = new OkHttpClient().newBuilder()
.connectTimeout(10, TimeUnit.SECONDS)
.writeTimeout(10, TimeUnit.SECONDS)
.readTimeout(10, TimeUnit.SECONDS).build();
mHandler = new Handler(Looper.getMainLooper());
} /**
* 单例模式 获取实例
*
* @return
*/
public static OKHttpHelper getInstance() {
if (mHelper == null) {
synchronized (OKHttpHelper.class) {
if (mHelper == null) {
mHelper = new OKHttpHelper();
}
}
}
return mHelper;
} /**
* 对外公开的post方法
* <p>
* post请求需要通过FormEncodingBuilder创建RequestBody对象,指定post传进去的参数
*
* @param url 请求地址
* @param params 请求参数
* @param callBack 回调接口
* @param tag 请求标签
*/
public void post(String url, Map<String, String> params, BaseCallBack callBack, int tag) throws Exception {
Request req = buildRequest(url, params, tag);
request(req, callBack);
} /**
* 对外公开的get方法
*
* @param url
* @param callBack
*/
public void get(String url, BaseCallBack callBack, int tag) throws Exception {
Request req = buildRequest(url, null, tag);
request(req, callBack);
} /**
* 构建request请求对象
*
* @param url
* @param params
* @return
*/
private Request buildRequest(String url, Map<String, String> params, int tag) {
Request.Builder builder = new Request.Builder();
builder.url(url);//请求地址
if (null == params) {
builder.get();//get请求
} else {
builder.post(buildRequestBody(params));//post请求 添加参数
}
builder.tag(tag);//tag 区分不同的请求
return builder.build();
} /**
* 通过Map的键值对 构建post请求的RequestBody对象
*
* @param params
* @return
*/
private RequestBody buildRequestBody(Map<String, String> params) {
FormBody.Builder formEncodingBuilder = new FormBody.Builder();
if (params != null) {
for (Map.Entry<String, String> entity : params.entrySet()) {
formEncodingBuilder.add(entity.getKey(), entity.getValue());
}
}
return formEncodingBuilder.build();
} /**
* 接口请求 post,get请求通用
*
* @param request 请求对象
* @param callBack 回调接口
*/
private void request(final Request request, final BaseCallBack callBack) throws Exception {
callBack.onRequestBefore();
mClient.newCall(request).enqueue(new Callback() {//异步访问网络
@Override
public void onFailure(Call call, final IOException exception) {
if (!call.isCanceled()) {//请求未取消
mHandler.post(new Runnable() {
@Override
public void run() {
//请求失败 网络异常
callBack.onFailure(exception);
}
});
}
} @Override
public void onResponse(Call call, final Response response) throws IOException {
if (!call.isCanceled()) {//链接超时 或者其他原因 导致请求取消
if (response.isSuccessful()) {
String res = response.body().string();
mHandler.post(new Runnable() {
@Override
public void run() {
callBack.onSuccess(response, (Integer) response.request().tag());
}
});
} else {
mHandler.post(new Runnable() {
@Override
public void run() {
//请求成功 获取数据异常
callBack.onError(response, response.code(), null);
}
});
}
}
}
});
}
}

回调接口

public abstract class BaseCallBack<T> {

    /**
* 请求之前调用
*/
public abstract void onRequestBefore(); /**
* 请求失败(网络问题)
* @param e
*/
public abstract void onFailure(Exception e); /**
* 请求成功
* @param response
* @param tag
*/
public abstract void onSuccess(Response response, int tag); /**
* 请求成功但是有错误(接口错误,数据解析错误等)
* @param response
* @param errorCode
* @param e
*/
public abstract void onError(Response response,int errorCode,Exception e); }

补充:

OKHttp 源码:http://blog.csdn.net/u012124438/article/details/54236967

AsyncHttpClient : 基于HTTPClient的异步请求框架 http://www.it165.net/pro/html/201406/16421.html

xutils : http://doc.okbase.net/u010870518/archive/125128.html

OKHttp3 简介与使用的更多相关文章

  1. 【转】Android OkHttp3简介和使用详解

    一 OKHttp简介 OKHttp是一个处理网络请求的开源项目,Android 当前最火热网络框架,由移动支付Square公司贡献,用于替代HttpUrlConnection和Apache HttpC ...

  2. Android OkHttp3简介和使用详解

    一 OKHttp简介 OKHttp是一个处理网络请求的开源项目,Android 当前最火热网络框架,由移动支付Square公司贡献,用于替代HttpUrlConnection和Apache HttpC ...

  3. Retrofit2 简介 语法 案例

    简介 官网:http://square.github.io/retrofit/ GitHub:https://github.com/square/retrofit/ compile 'com.squa ...

  4. Okhttp【简介】应用 示例

    资源 GitHub:https://github.com/square/okhttp 官网     文档     API  You'll also need Okio[https://github.c ...

  5. OKHttp3学习

    转载 Okhttp3基本使用 基本使用——OkHttp3详细使用教程 一.简介 HTTP是现代应用常用的一种交换数据和媒体的网络方式,高效地使用HTTP能让资源加载更快,节省带宽. OkHttp是一个 ...

  6. okhttp的简介(二)之简单封装

    前一篇文章简单的介绍了okhttp的简单使用.okhttp的简介(一):http://blog.csdn.net/wuyinlei/article/details/50579564 相信使用还是非常好 ...

  7. OkHttp3 使用详解

    一,简介 OkHttp 是一个高效的 HTTP 客户端,具有非常多的优势: 能够高效的执行 http,数据加载速度更快,更省流量 支持 GZIP 压缩,提升速度,节省流量 缓存响应数据,避免了重复的网 ...

  8. Http请求-okhttp3基本用法

    简介 HTTP是现代应用常用的一种交换数据和媒体的网络方式,高效地使用HTTP能让资源加载更快,节省带宽.OkHttp是一个高效的HTTP客户端,它有以下默认特性: 支持HTTP/2,允许所有同一个主 ...

  9. [技术博客]OKhttp3使用get,post,delete,patch四种请求

    OKhttp3使用get,post,delete,patch四种请求 1.okhttp简介 okhttp封装了大量http操作,大大简化了安卓网络请求操作,是现在最火的安卓端轻量级网络框架.如今okh ...

随机推荐

  1. 洛谷 P1541 乌龟棋 & [NOIP2010提高组](dp)

    传送门 解题思路 一道裸的dp. 用dp[i][j][k][kk]表示用i个1步,j个2步,k个3步,kk个4步所获得的最大价值,然后状态转移方程就要分情况讨论了(详见代码) 然后就是一开始统计一下几 ...

  2. 1、Java语言概述与开发环境——Java程序运行机制

    Java语言是一种特殊的高级语言,它既有解释型语言的特性,也具有编译型语言的特征,因为Java要经过先编译后解释两个步骤. 一.高级语言的运行机制 计算机高级语言按程序的执行方式可以分为编译型和解释型 ...

  3. git命令?

    #文件及文件夹创建删除    mkdir  文件名称    (创建文件夹)    touch  文件名称    (创建文件)    rm -r  文件名称     (递归删除)    rm -rf 文 ...

  4. app接口开发

    最近一段时间一直在做APP接口,总结一下APP接口开发过程中的注意事项: 1.效率:接口访问速度 APP有别于WEB服务,对服务器端要求是比较严格的,在移动端有限的带宽条件下,要求接口响应速度要快,所 ...

  5. linux中文件权限格式与chmod命令以及用户和用户组的管理

    简单了解一下linux中的文件权限格式与chmod命令 chmod命令:改变文件或者目录的权限 格式:chmod [参数] [<权限范围><符号><权限代码>] - ...

  6. 7.css3表格、列表、边框的样式设置--list/border

    1.css表格: ①Border-collapse是否把表格边框合并为单一的边框.Separate默认值,collapse合并. ②Border-spacing分割单元格边框的距离. ③Caption ...

  7. listalias - 列出用户和系统别名

    总揽 listalias [ -s | -u ] [ 正则表达式] 描述 Listalias 按用户及系统别名每个输出一行.每行具有下列格式: <别名> <地址> (<注 ...

  8. newgrp - 登录到新的用户组中

    总览 (SYNOPSIS) newgrp [ group ] 描述 (DESCRIPTION) Newgrp 改变 调用者 的 用户组标识, 类似于 login(1). 调用者 仍旧 登录 在 系统 ...

  9. CentOS7 安装 Mysql5.6.40

    CentOS7.5二进制安装MySQL-5.6.40 安装之后登陆不上,mysql.user 表是空的时: Mysql User表为空 mysql创建用户报错ERROR 1364 (HY000): F ...

  10. VB TreeView控件使用详解(有趣的示例)

    第一小时:学习直接用代码将数据填充到树控件中. 为什么要先学习直接用代码将数据填充到树控件中?因为这种方法是最简单的,代码也最容易理解,学习树控件,先将这个学会,已经掌握了一半,所以先不要急着想怎么将 ...