OkHttp的简单使用

OKHTTP:
1.为什么要使用okhttp?
使用范围
OkHttp支持Android 2.3及其以上版本。 对于java JDK1.7以上。
官方英文网站
中文社区
Android系统提供了两种HTTP通信类,HttpURLConnection和HttpClient。
尽管Google在大部分安卓版本中推荐使用HttpURLConnection,但是这个类相比HttpClient实在是太难用,太弱爆了。
OkHttp是一个相对成熟的解决方案,据说Android4.4的源码中可以看到HttpURLConnection已经替换成OkHttp实现了。所以我们更有理由相信OkHttp的强大。

okhttp的优点和不足
1、优点
支持SPDY, 可以合并多个到同一个主机的请,使用连接池技术减少请求的延迟(如果SPDY是可用的
话) ,
SPDY协议是Google提出的基于传输控制协议(TCP)的应用层协议,通过压缩、多路复用和优先级来缩短加载时间。该协议是一种更加快速的内容传输协议。
使用GZIP压缩减少传输的数据量,缓存响应避免重复的网络请求、拦截器等等。
2、缺点
第一缺点是消息回来需要切到主线程,主线程要自己去写,第二传入调用比较复杂。

okhttp 的机制原理

一、介绍
OKHttp是一款高效的HTTP客户端,支持连接同一地址的链接共享同一个socket,通过连接池来减小响应延迟,
还有透明的GZIP压缩,请求缓存等优势,其核心主要有 路由、连接协议、拦截器、代理、安全性认证、连接池以
及网络适配,拦截器主要是指添加,移除或者转换请求或者回应的头部信息,总流程图如下:

基础使用:
// okhttp实现HttpPost 网络访问
//square 公司出的Http请求库;
//android 原始类 HttpUrlconnection和httpClient;

//高级用法
// 基于Http Post的文件上传(类似表单)
// 多文件和多参数同时上传
MultipartBuilder表单传入
// 大文件下载和下载进度回调
// 大文件上传和上传进度回调
// 支持session的保持
// 支持自签名网站https的访问,提供方法设置下证书就行
// 支持根据Tag取消请求


// okhttp实现HttpGet 网络访问
1.实例化:OkHttpClient;
2.获取对象 Request (Request 是okhttp中访问请求builder是一个辅助类);
3.获取对象Response ,获取call对象调用execute;
4.//获取Responsedbody对象。通过//获取Responsed对象body方法获取数据;
5.从Responsedbody对象中获取服务器返回的数据
// okhttp实现HttpPost 网络访问(json,键值对)
1.builder放入键值对
2.获取requestbody对象
3.获取request对象,将reqbodybody放入它
4.获取response对象
5.获取responsebody对象
6从response中获取服务器返回数据

OkHttp支持同步&异步获得数据
1. 同步get
new Thread( new Runnable() { @Override public void run() { //1. 得到OKHttpClient对象 OkHttpClient okHttpClient = new OkHttpClient(); //2. 获取Request对象 ,内部也是通过建造者模式去封装的一些请求参数 Request request = new Request.Builder() .url(url) .build(); //3. 获取Call对象 Call call = okHttpClient.newCall(request); //4. 获取Response对象 try { Response response = call.execute(); //响应体 ResponseBody body = response.body(); //可以根据自己的需要,返回相应的类型: //可以返回byte数组, 可以返回 InputStream ,可以返回 字符串 // byte[] bytes = body.bytes(); //InputStream inputStream = body.byteStream(); final String result = body.string(); //注意这里是string()方法,不要写成toString() // 这个方法执行在主线程当中 // 如果 当前的动作,在主线程中会立即执行 // 如果 当前的动作在子线程中,会先发送到主线程中,然后去执行 runOnUiThread( new Runnable() { @Override public void run() { mTvResult.setText(result); } }); } catch (IOException e) { e.printStackTrace(); } }}).start();

2. 异步get
//1. 得到OKHttpClient对象 OkHttpClient okHttpClient = new OkHttpClient(); //2. 获取Request对象 Request request = new Request.Builder() .url(Constant.URL_GET_ASYNC) .build(); //3. 获取Call对象 Call call = okHttpClient.newCall(request); //4. 获取Response对象, 通过接口回调方式返回Response call.enqueue( new Callback() { @Override public void onFailure(Call call, IOException e) { //TODO 请求失败逻辑在这里处理 //TODO 注意:这里边都是子线程,所以要更改UI的时候需要发送到主线程才OK } @Override public void onResponse(Call call, Response response) throws IOException { //TODO 请求成功时候 //TODO 注意:这里边都是子线程,所以要更改UI的时候需要发送到主线程才OK String result = response.body().string(); }});

3.同步post
new Thread( new Runnable() { @Override public void run() { //1. 得到OKHttpClient OkHttpClient okHttpClient = new OkHttpClient(); //2. 得到RequestBody对象,通过FormBody.Builder()来获取,通过add方法提交键值对 RequestBody body = new FormBody.Builder() .add( "key1" , "value1" ) .add( "key2" , "value2" ) .build(); //3. 创建Request对象 Request request = new Request.Builder() .url(url) .post(body) .build(); //4. 得到Call对象 Call call = okHttpClient.newCall(request); try { Response response = call.execute(); if (response.isSuccessful()) { final String result = response.body().string(); runOnUiThread( new Runnable() { @Override public void run() { mTvResult.setText(result); } }); } } catch (IOException e) { e.printStackTrace(); } }}).start();

4.异步post
OkHttpClient okHttpClient = new OkHttpClient();RequestBody requestBody = new FormBody.Builder() .add( "key1" , "value1" ) .add( "key2" , "value2" ) .build();Request request = new Request.Builder() .url(url) .post(requestBody) .build();Call call = okHttpClient.newCall(request);call.enqueue( new Callback() { @Override public void onFailure(Call call, IOException e) { //TODO 失败的,在子线程中 } @Override public void onResponse(Call call, Response response) throws IOException { //TODO 成功时,在子线程中。 }});

提交json数据
OkHttpClient okHttpClient = new OkHttpClient(); //创建RequetBody对象, 这里注意:不论什么类型的Post请求,只是 RequestBody获取的方式不一样,其他步骤的一模一样 MediaType mediaType = MediaType.parse( "application/json; charset=utf-8" );RequestBody requestBody = RequestBody.create(mediaType, YOURJSONSTRING); //获取Request对象 Request request = new Request.Builder() .url(url) .post(requestBody) .build(); //获取Call对象 Call call = okHttpClient.newCall(request);call.enqueue( new Callback() { @Override public void onFailure(Call call, IOException e) { } @Override public void onResponse(Call call, Response response) throws IOException { }});


解决okhttp 报java.lang.IllegalStateException: closed,java.lang.IllegalStateException: closed,原因为 OkHttp请求回调中response.body().string()只能有效调用一次
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值