OkHttp同步方法总结
1.创建OkHttpClirnt和Request对象 ,通过Builder模式创建
2.将Request封装成Call对象
3.调用Call的execute()发送同步请求
OkHttp同步需要注意
发送请求后,就会进入阻塞状态,知道收到响应。
异步:
1.创建OkHttpClirnt和Request对象 ,通过Builder模式创建
2.将Request封装成Call对象
3.调用Call的enqueue()发送异步请求
开启一个新的线程
区别:
发送请求的方法调用
阻塞线程与否,同步会,异步不会,会开启一个新的线程
同步流程:
异步流程:
1.判断当前call
2.封住成一个AsyncCall对象
3.client.dispatcher().enqueue()
发送同步和异步都会有dispatcher完成
dispatcher的作用为维护请求的状态,并维护一个线程池,用于执行请求。
拦截器
创建一系列拦截器,并将拦截器放入到一个List集合中
创建一个拦截器链ReallnterceptorChain,并执行拦截器链的proceed方法。
1.发起请求前对request进行处理
2.调用下一个拦截器,获取respone
对respone进行处理,返回给上一个拦截器
重定向拦截器
创建StreamAllocation对象
调用ReallnterceptorChain.proceed()进行网络请求
根据异常结果或者响应结果判断 是否进行重新请求
调用下一个拦截器,对respone进行处理,返回给上一个拦截器
BridgeInterceptor桥接拦截器
1.是负责将用户构建的一个Request请求转化为能够进行网络访问的请求
2.将这个符合网络请求的Request进行网络请求
3.将网络请求回来的响应Resuest转化为用户 可用的Response。
缓存策略
如何使用:创建OkhttpClient创建cache进行缓存
Cache的put方法
DisklruCache 写入
加密
entry.writeto进行缓存
判断是不是https
缓存
判断是否为GET 如果是则缓存,POST不用缓存
Cache的get方法
解密
网络连接拦截器(ConnectInterceptor)
ConnectInterceptor获取Interceptor传过来的StreamAllocation,streamAllocation.newStream()
将刚才创建的用于网络IO的RealConnection对象,以及对于与服务器交互最为关键的HttpCodec等对象传递给后面的拦截器。
newStream方法
1.弄一个RealConnectior对象
2.选择不同的链接方式
3.CallServerIntercentor
连接池的put,get方法
ConnectionPool时间范围内复用Connection,对他有效的进行清理回收工作
get由for循环遍历连接池的connection,获取一个可用的connection,判断这个连接是否可供我们使用,可以的时候调用acquire获取我们的连接池。
put做一个异步的清理任务
1.产生一个StreamAllocation对象
2.StreamAllocation对象的弱应用添加到RealConnection对象的allocations集合中
3.从链接池中获取
如何实现自动回收
1.GC
使用了GC回收算法
2.StreamAllocation的数量
StreamAllocation的数量会渐渐变成0
3.cleanUpRunnable
被线程池检测到并回收,这样就可以保持多个健康的keep-alive连接。
CallServerInter拦截器
1.,向服务器发送网络请求
2.接收服务器给我们的响应
HttpCodes 编码request 解码respone
网络请求网络的大致过程
1.Call对象对请求的封装
2.dispatcher对请求的分发
3.getResponseWhithInterceptors()方法
RetryAndFollowUpInterceptor(重定向拦截器)
CacheInterceptor(缓存拦截器)
BridgeInterceptor(转换拦截器)
ConnectionInterceptor(建立连接)
CallServerInterceptor(网络请求)
OkHttp面试相关
1.Android基础的网络编程:socket,HttpClient和HttpURLConnection;
socket
1)socket是什么?
是一个对TCP/IP协议进行封装的编程调用接口。
成对出现,一对套接字:包括ip地址和Tcp协议。
socket就是基于我们应用层和传输层之间抽象出来的一个层。通过它来发送接收数据,使用socket可以将应用程序添加到网络中。
2)Socket通信模型?
基于TCP协议
采用字节流的形式来提供我们可靠的 字节流服务
基于UDP协议
采用数据保密的形式,提供我们数据的打包发送的数据
3)Socket与Http对比?
Android通信有两种?
Http通信
Socket通信
区别:
Http:采用请求-响应方式。HTTP协议属于应用层。
Socket:采用服务器主动发送数据的方式,Socket属于传输层。
4)Socket如何实现?
TCP客户端:
TCP服务端:
HttpClient:
HttpURLConnection:
2.了解websocket吗?知道和socket的区别吗?okhttp是如何处理websocket的相关问题的?
推送技术:轮询
轮询是在特定的时间间隔,由浏览器对服务器发出的HTTP请求,然后由服务器返回最新的数据给客户端的浏览器。
短轮询
缺点:在某个时间段server没有更新数据,但client仍然每隔一段时间发送请求来询问,所以这段时间内的询问都是无效的。
长轮询
轮询缺点:浪费带宽(HTTP HEAD是比较大的)
消耗服务器CPU占用
WebSocket如何交互
WebSocket与HTTP同等的网络协议
双向通信协议
WebSocket与Socket
Socket其实并不是一个协议
WebSocket是一种协议
他俩没关系
WebSocket
1.本质上是一个基于TCP的协议
2.向服务器发起一个HTTP请求/“Upgrade:WebSocket”
3.服务器端解析这些附加的头信息
3.Http如何处理缓存?OkHttp如何处理缓存相关的问题?
Http缓存:强制缓存:
Expires:值为服务端返回的到期时间,
问题:到期时间是由服务端生成的
Cache-Control:是由服务器返回的Response中添加的头信息。
private,public,max-age,no-cache,no-store
对比缓存:
首先需要进行比较判断是否可以使用缓存
服务器会将缓存标识与数据一起返回给客户端
Etag:服务器响应请求时,告诉浏览器当前资源在服务器唯一的标识。
If-None-Match:再次请求服务器时,通过此字段通知服务器客户端缓存数据的唯一标识
Last-Modified:服务器在响应请求时,告诉浏览器资源的最后修改时间
If-Modified-Since:再次请求服务器时,通过此字段通知服务器上次请求时,服务器返回的资源最后修改时间
4.断点续传的原理?如何实现?OkHttp中如何实现相关的问题?
断点续传:从文件已经下载的地方继续开始下载
HttpURLConnection断点续传
OkHttp断点续传
5.多线程下载原理okhttp如何实现?
多线程下载:每个线程只负责下载文件的一部分
HttpURLConnection多线程下载
6.文件上传如何做?原理?okhttp如何完成文件上传?
Http之contentType
Content-Type属性指定请求和响应的HTTP内容类型。
7.json数据如何去解析?Okhttp如何去解析json数据?
8.okhttp如何处理https?