设为首页 加入收藏

TOP

Android之OkHttp详解(非原创)(一)
2019-08-30 07:27:14 】 浏览:139
Tags:Android OkHttp 详解 原创

文章大纲

一、OkHttp简介
二、OkHttp简单使用
三、OkHttp封装
四、项目源码下载

 

一、OkHttp简介

1. 什么是OkHttp

??一般在Java平台上,我们会使用Apache HttpClient作为Http客户端,用于发送 HTTP 请求,并对响应进行处理。比如可以使用http客户端与第三方服务(如SSO服务)进行集成,当然还可以爬取网上的数据等。OKHttp与HttpClient类似,也是一个Http客户端,提供了对 HTTP/2 和 SPDY 的支持,并提供了连接池,GZIP 压缩和 HTTP 响应缓存功能。

2. OkHttp优点

(1)支持HTTP2/SPDY(SPDY是Google开发的基于TCP的传输层协议,用以最小化网络延迟,提升网络速度,优化用户的网络使用体验)
(2)socket自动选择最好路线,并支持自动重连,拥有自动维护的socket连接池,减少握手次数,减少了请求延迟,共享Socket,减少对服务器的请求次数
(3)基于Headers的缓存策略减少重复的网络请求
(4)拥有Interceptors轻松处理请求与响应(自动处理GZip压缩)

3. OkHttp功能

(1)一般的get请求
(2)一般的post请求
(3)基于Http的文件上传
(4)文件下载
(5)上传下载的进度回调
(6)加载图片
(7)支持请求回调,直接返回对象、对象集合
(8)支持session的保持
(9)支持自签名网站https的访问,提供方法设置下证书就行
(10)支持取消某个请求

3. OkHttp使用步骤

(1)get请求的步骤,首先构造一个Request对象,参数最起码有个url,当然你可以通过Request.Builder设置更多的参数比如:header、method等。
(2)然后通过request的对象去构造得到一个Call对象,类似于将你的请求封装成了任务,既然是任务,就会有execute()和cancel()等方法。
(3)最后,我们希望以异步的方式去执行请求,所以我们调用的是call.enqueue,将call加入调度队列,然后等待任务执行完成,我们在Callback中即可得到结果。
(4)onResponse回调的参数是response,一般情况下,比如我们希望获得返回的字符串,
可以通过response.body().string()获取;如果希望获得返回的二进制字节数组,则调用response.body().bytes();如果你想拿到返回的inputStream,则调用response.body().byteStream()
(5)看到这,你可能会奇怪,竟然还能拿到返回的inputStream,看到这个最起码能意识到一点,这里支持大文件下载,有inputStream我们就可以通过IO的方式写文件。不过也说明一个问题,这个onResponse执行的线程并不是UI线程。的确是的,如果你希望操作控件,还是需要使用handler等
(6)okHttp还支持GJson的处理方式
(7)okhttp支持同步请求和异步请求,Call call = client.newCall(request);为同步请求,发送请求后,就会进入阻塞状态,知道收到响应call.enqueue(new Callback()为异步请求
(8)在okhttp3.Callback的回调方法里面有个参数是Call 这个call可以单独取消相应的请求,随便在onFailure或者onResponse方法内部执行call.cancel()都可以。如果想取消所有的请求,则可以okhttpclient.dispatcher().cancelAll();

二、OkHttp简单使用

1. 进行get请求

/** * 原始的get请求 * * @author 吴晓畅 * */ public class OkHttpGet { public void get() { //1.okhttpClient对象 OkHttpClient okHttpClient = new OkHttpClient.Builder(). //在这里,还可以设置数据缓存等 //设置超时时间 connectTimeout(15, TimeUnit.SECONDS). readTimeout(20, TimeUnit.SECONDS). writeTimeout(20, TimeUnit.SECONDS). //错误重连 retryOnConnectionFailure(true). build(); //2构造Request, //builder.get()代表的是get请求,url方法里面放的参数是一个网络地址 Request.Builder builder = new Request.Builder(); Request request = builder.get().url("http://www.baidu.com/").build(); //3将Request封装成call Call call = okHttpClient.newCall(request); //4,执行call,这个方法是异步请求数据 call.enqueue(new Callback() { @Override public void onFailure(Call arg0, IOException arg1) { //失败调用 } @Override //由于OkHttp在解析response的时候依靠的是response头信息当中的Content-Type字段来判断解码方式 //OkHttp会使用默认的UTF-8编码方式来解码 //这里使用的是异步加载,如果需要使用控件,则在主线程中调用 public void onResponse(Call arg0, Response arg1) throws IOException { //成功调用 } }); } } 

2. 进行post请求

/** * 使用okhttp进行post请求 * * @author 吴晓畅 * */ public class OkHttpPost { public void initPost() { //1.okhttpClient对象 OkHttpClient okHttpClient = new OkHttpClient.Builder(). //在这里,还可以设置数据缓存等 //设置超时时间 connectTimeout(15, TimeUnit.SECONDS). readTimeout(20, TimeUnit.SECONDS). writeTimeout(20, TimeUnit.SECONDS). //错误重连 retryOnConnectionFailure(true). build(); RequestBody requestBodyPost = new FormBody.Builder() .add("page", "1") .add("code", "news") .add("pageSize", "20") .add("parentid", "0") .add("type", "1") .buil
首页 上一页 1 2 3 4 5 下一页 尾页 1/5/5
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Android-原笔迹钢笔手写的探索与.. 下一篇Android之RxJava详解(非原创)

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目