Android面试题:okhttp

目录

官方文档:

源码位置

相关视频:

相关文章:

常见问题一:简述一下OkHttp

常见问题二:看过OkHttp的源码吗,简单说一下

一、基本知识:(以下基于qndroid的视频内容进行文字整理)

(一)、HTTP协议结构:

(二)、HTTP工作流程

(三)、HTTP优势:

(四)、SPDY(发音spidi)

(五)、HTTP2.0介绍

(六)、okhttp

(七)、okhttp优势:

二、OkHttp总体设计

(一)、总体设计

(二)、流程图

(三)、OkHttp的多路复用机制

(四)、重连机制

 (五)、核心类讲解:

三、封装


官方文档:

http://square.github.io/okhttp/#overview

源码位置

相关视频:

okhttp框架解析与应用

Android网络框架-OkHttp使用

相关文章:

OkHttp3.4.x源码剖析

OkHttp使用教程

OKHttp源码解析

从官方示例看OkHttp——OkHttp 3.9.1 源码浅析

Android技能树 — 网络小结之 OkHttp

OKHttp源码解析(一)--初阶

okhttp源码解析

Android面试题-OkHttp3源码分析

OkHttp源码解析

Okhttp与其他网络框架的对比:

Android 网络(三)

常见问题一:简述一下OkHttp

OkHttp是一个非常优秀的网络请求框架,已被谷歌加入到Android的源码中。目前比较流行的Retrofit也是默认使用OkHttp的。

  • 支持http2,对一台机器的所有请求共享同一个socket
  • 内置连接池,支持连接复用,减少延迟
  • 支持透明的gzip压缩响应体
  • 通过缓存避免重复的请求
  • 请求失败时自动重试主机的其他ip,自动重定向
  • 好用的API

常见问题二:看过OkHttp的源码吗,简单说一下

 

一、基本知识:(以下基于qndroid的视频内容进行文字整理)

(一)、HTTP协议结构:

请求头

  •     表明本次请求的客户端
  •     本次请求所使用的cookie
  •     本次请求希望返回的数据类型
  •     本次请求是否采用数据压缩等等一系列设置

请求体

  •     指定本次请求所使用的方法
  •     主要用来携带本次请求的参数    

响应头

  •     服务器标识
  •     状态码
  •     内容编码
  •     返回给客户端的cookie等

响应体

  •     本次请求所返回的数据

(二)、HTTP工作流程

    首先客户机与服务器需要建立连接(通过socket)
    建立连接后,客户机发送一个请求给服务器
    服务器接到请求后,给予相应的响应信息
    客户端接受服务器所返回的信息,连接断开

(三)、HTTP优势:

  •     简单快速
  •     灵活
  •     无连接
  •     无状态

解释:其中最重要的是无连接和无状态,在早期的互联网中,由于协议都是一些比较简单的协议,内容基本上都是一些静态的页面、图片等,所以无连接、无状态的HTTP可以发挥自己简单快速、灵活的优势。 但随着业务逻辑越来越复杂以及我们对安全性的重视,无连接、无状态反而成为了HTTP的劣势,所以也就又来后来更加高级的互联网协议的诞生。

(四)、SPDY(发音spidi)

  •     SPDY是一种HTTP的兼容协议
  •     支持多路复用请求
  •     对请求划分优先级(优先返回文字,图片音频等随后返回)
  •     压缩HTTP头,以减少请求数据量

(五)、HTTP2.0介绍

  •     基于SPDY,IETF(国际互联网工程任务组 The Internet Engineering Task Force,简称 IETF)制定的新一代HTTP
  •     拥有更安全的SSL协议
     

(六)、okhttp

  •     为我们android客户端支持HTTP2.0提供了途径
  •     由著名的square团队开发,开源
     

(七)、okhttp优势:

  •     支持SPDY、HTTP2.0,共享同一个socket来处理同一个服务器的所有请求
  •     如果SPDY不可用,则通过连接池来减少请求延时
  •     无缝支持GZIP来减少数据流量
  •     支持同步、异步(异步使用较多)
  •     缓存响应数据来减少重复的网络请求
  •     可以从很多常用的连接问题中自动恢复
  •     使用简单(api多,可扩展性好)

二、OkHttp总体设计

OKHttp源码解析

(一)、总体设计

Android面试题:okhttp_第1张图片

  • 第一,通过一个构建者模式(Request.Builder)构建所有的request,然后分发到Dispatcher(分发器);
  • 第二,Dispatcher再把request分发到HttpEngine(真正干活的类)中,HttpEngine首先要看一下本次请求有没有cache(缓存),如果有缓存,就从缓存中拿到信息,然后返回给response;如果没有缓存,HttpEngine就把request分发到ConnectionPool(连接池)中;
  • 第三,在ConnectionPool(连接池)中,通过Connection发送请求,首先选择Route(路由)和Platfrom(平台),然后到达Server(Socket),获取到Data,然后返回response。

(二)、流程图

Android面试题:okhttp_第2张图片

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

(三)、OkHttp的多路复用机制

Android面试题:okhttp_第3张图片

HttpEngine在发起请求之前,会先调用nextConnection()来获取一个Connection对象,如果可以从ConnectionPool中获取一个Connection对象,就不会新建,如果无法获取,就会调用createnextConnection()来新建一个Connection对象,这就是okhttp多路复用的核心,不像之前的网络框架,无论有没有,都会新建Connection对象。

(四)、重连机制

Android面试题:okhttp_第4张图片

重连机制:
每一个call发送到HttpEngine后,HttpEngine都会判断是否能够getResponse(),如果不能成功的话,就会调用recover()开始retry重连,这是一个while死循环,只有获取到数据后,才会break跳出死循环。

 (五)、核心类讲解:

由于整个设计类图比较大,所以本人将从核心入口client、cache、interceptor、网络配置、连接池、平台适配性…这些方面来逐一进行分析源代码的设计。下面是核心入口OkHttpClient的类设计图

 

Android面试题:okhttp_第5张图片

三、封装

网络模块封装好处;
    强大的可复用性;
    与业务逻辑完全隔离;
    强大的可扩展性;

封装思路讲解:
    封装一个公共的OkHttpClient(超时时间等基本设置,get,post等请求方法);
    封装一个通用的请求创建类CommonRequest;
    封装一个通用的响应解析类JsonCommonRequest;


    

 

你可能感兴趣的:(Andorid:面试,Android:Okhttp)