android-OKHttp

来源:互联网 发布:为什么学java 编辑:程序博客网 时间:2024/06/05 16:55

Android为我们提供了两种HTTP交互的方式:HttpURLConnection 和 Apache HTTP Client,虽然两者都支持HTTPS,流的上传和下载,配置超时,IPv6和连接池,已足够满足我们各种HTTP请求的需求。但更高效的使用HTTP 可以让您的应用运行更快、更节省流量。而OkHttp库就是为此而生。

OkHttp是一个高效的HTTP库:
1、支持 SPDY ,共享同一个Socket来处理同一个服务器的所有请求
2、如果SPDY不可用,则通过连接池来减少请求延时
3、无缝的支持GZIP来减少数据流量
4、缓存响应数据来减少重复的网络请求

其核心主要有路由(对地址的一个封装类)、连接协议、拦截器、代理、安全性认证、连接池以
及网络适配,拦截器主要是指添加,移除或者转换请求或者回应的头部信息。

上 面是OKHttp总体设计图,主要是通过Diapatcher不断从RequestQueue中取出请求(Call),根据是否已缓存调用Cache或 Network这两类数据获取接口之一,从内存缓存或是服务器取得请求的数据。该引擎有同步和异步请求,同步请求通过Call.execute()直接返 回当前的Response,而异步请求会把当前的请求Call.enqueue添加(AsyncCall)到请求队列中,并通过回调(Callback) 的方式来获取最后结果。

参考:
OKHttp源码解析

OkHttp官方教程解析-彻底入门OkHttp使用

Android 一个改善的okHttp封装库

带你学开源项目:OkHttp– 自己动手实现 okhttp

缺点
1、消息回来需要切到主线程,主线程要自己去写,
2、传入调用比较复杂。

SPDY(读作“SPeeDY”)

是Google开发的基于TCP的传输层协议,用以最小化网络延迟,提升网络速度,优化用户的网络使用体验。SPDY并不是一种用于替代HTTP的协议,而是对HTTP协议的增强。新协议的功能包括数据流的多路复用、请求优先级以及HTTP报头压缩。谷歌表示,引入SPDY协议后,在实验室测试中页面加载速度比原先快64%。

GZIP

GZIP最早由Jean-loup Gailly和Mark Adler创建,用于UNⅨ系统的文件压缩。我们在Linux中经常会用到后缀为.gz的文件,它们就是GZIP格式的。现今已经成为Internet 上使用非常普遍的一种数据压缩格式,或者说一种文件格式。

HTTP协议上的GZIP编码是一种用来改进WEB应用程序性能的技术。大流量的WEB站点常常使用GZIP压缩技术来让用户感受更快的速度。这一般是指WWW服务器中安装的一个功能,当有人来访问这个服务器中的网站时,服务器中的这个功能就将网页内容压缩后传输到来访的电脑浏览器中显示出来.一般对纯文本内容可压缩到原大小的40%.这样传输就快了,效果就是你点击网址后会很快的显示出来.当然这也会增加服务器的负载. 一般服务器中都安装有这个功能模块的。

减少文件大小有两个明显的好处,一是可以减少存储空间,二是通过网络传输文件时,可以减少传输的时间。gzip 是在 Linux 系统中经常使用的一个对文件进行压缩和解压缩的命令,既方便又好用。

简单的异步Get请求

  第一步,创建OKHttpClient对象

  第二步,创建Request请求

  第三步,创建一个Call对象

  第四步,将请求添加到调度中

//okHttp的基本使用 --- get方法    String url = "https://api.douban.com/v2/movie/top250?start=0&count=10";    //1,创建OKHttpClient对象    OkHttpClient mOkHttpClient = new OkHttpClient();    //2,创建一个Request    Request request = new Request.Builder().url(url).build();    //3,创建一个call对象    Call call = mOkHttpClient.newCall(request);    //4,将请求添加到调度中    call.enqueue(new Callback() {        @Override        public void onFailure(Request request, IOException e) {        }        @Override        public void onResponse(Response response) throws IOException {            if (response.isSuccessful()) {                final String message = response.body().string();                handler.post(new Runnable() {                    @Override                    public void run() {                        tv_message.setText(message);                        progressBar.setVisibility(View.GONE);                    }                });            }        }    });