1、简述一下OkHttp
它是一个非常优秀的网络请求框架,已被google加入到Android的源码中。目前比较流行的Retrofit也是默认使用的Okhttp。
1)支持http2,对一台机器的所有请求共享同一个socket
2)内置连接池,支持连接复用,减少延迟
3)支持透明的gzip压缩响应体
4)通过缓存避免重复的请求
5)请求失败时自动重试主机的其他ip,自动重定向
6)好用的API
2、使用
1)创建OkHttpClient对象:OkHttpClient client = new OkHttpClient();
2)创建网络请求: Request request = new Request.build.url(“http://xxx.xxx.xxx”).build;
3)得到call对象: Call call = client.newCall(request);
4)发送请求,获取返回的数据:
同步 Response response = call.excute();
异步 call.enqueue();
3、OKhttp原理
1) okhttp主要实现了异步、同步的网络操作
2) 创建了不同的call对象,这里的call对象是一个个的runnable对象,由于我们的任务是很多的,因此这里有Dispatcher包装了线程池来处理不同的call,其中该类中创建了三种队列,分别用于存放正在执行的异步任务,同步队列,以及准备的队列。
3)最后在执行每个任务的时候,采用队列的先进先出原则,处理每一个任务,都是交给了后面的各种拦截器来处理,有请求准备的拦截器、缓存拦截器、网络连接的拦截器,每一个拦截器组成了一个责任链的形式。到最后返回response信息。
4)OkHttp的底层是通过Java的Socket发送HTTP请求与接受响应的(这也好理解,HTTP就是基于TCP协议的),但是OkHttp实现了连接池的概念,即对于同一主机的多个请求,其实可以公用一个Socket连接,而不是每次发送完HTTP请求就关闭底层的Socket,这样就实现了连接池的概念。而OkHttp对Socket的读写操作使用的OkIo库进行了一层封装。