Android高级开发之【OkHttp】详解(附项目源码)

本文详细介绍了OkHttp,包括其简介、优点、简单使用方法和封装技巧。OkHttp是一个高效的HTTP客户端,支持HTTP2/SPDY,提供连接池和缓存策略。文章涵盖了OkHttp的异步和同步请求,拦截器的使用,以及如何进行get、post请求和文件上传下载。此外,还讨论了OkHttpUtils框架封装,以简化网络请求。
摘要由CSDN通过智能技术生成

文章大纲

一、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).
            
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值