Android OkHttp 框架分析

OkHttp 是一个高效的Http 客户端,是squareup 公司出品,它有以下默认特性:

1. 支持Http/2 ,允许所有同一个主机地址请求共享同一个socket 连接

2. 连接池使用较少请求延时

3. 透明的GZIP压缩减少响应数据的大小

4. 缓存响应内容,避免一些重复的请求

1) OkHttp 使用:

引入OkHttp相关库:

implementation 'com.squareup.okhttp3:okhttp:3.10.0'

Post请求:

MediaType mediaType = MediaType.parse("text/x-markdown; charset=utf-8");
String requestBody  = "test";
//构造Request 对象
Request request = new Request.Builder().url("https://api.github.com/markdown/raw").post(RequestBody.create(mediaType,requestBody)).build();
//初始化 OkHttpClient对象
OkHttpClient okHttpClient = new OkHttpClient();
// 创建Call对象,并通过enqueue 发起异步请求
okHttpClient.newCall(request).enqueue(new Callback() {
    @Override
    public void onFailure(Call call, IOException e) {
    }

    @Override
    public void onResponse(Call call, Response response) throws IOException {
    }
});

2) OkHttp 工作整体流程:

1.  通过okhttpclient 创建Call, 发起同步或者异步请求

2.  okhttpclient 会通过Dispatcher 对RealCall (Call的具体实现类) 进行统一管理, 并通过execute()和 enqueue() 对同步或异步请求进行处理。

3.  execute() 和 enqueue() 这两个方法会最终调用RealCall 中的 getResponseWithInterceptorChain(), 从拦截器链中获取返回结果。

4. 拦截器链中,依次通过 RetryAndFollowUpInterceptor(重定向拦截器),BridgeInterceptor(桥接拦截器),CacheInterceptor(缓存拦截器),ConnectInterceptor (连接拦截器), CallServerInterceptor ( 网络拦截器) 对请求依次处理,与服务建立连接后,获取返回上诉拦截器依次处理后,最后将结果返回给调用方。

流程图如下:

Android OkHttp 框架分析_第1张图片

3) 重要类

OkHttpClient:

OkHttpClient 继承了Call.Factory, 实现newCall, 返回一个Call对象。 使用 okHttpClient 最好创建一个单例,因为每个client 都有自己的一个连接池connection pool 和线程池 thread pools,重用这些连接池和线程池延节约内存。OkHttpClient 内部使用了builder 模式去构造。

Dispatcher:

Dispatcher 可以理解为调度器,当调用newCall 时,会不断从RequestQueue中取出请求Call,  有同步和异步请求区别,同步请求通过Call.execute() 直接返回当前的Response, 而异步请求会把当前的请求Call.enqueue 添加到请求队列中,并通过CallBack的方式来获取请求结果。

Call, RealCall:

Call 是一个接口类,定义了http 请求的方法。

RealCall 是Call的实现类,里面最主要的两个方法是execute 和 enqueue . 该类的enqueue 会去调用dispatcher中的enqueue 方法。 如果是同步请求 RealCall 会通过 getResponseWithInterceptorChain() 获取返回Response.  异步请求最终也会调用execute, 并通过callback 进行回调。

Interceptor (拦截器):

Interceptor 拦截器, 是网络请求库的核心, 它把实际的网络请求,缓存,压缩等功能统一起来, 每一个功能都是一个Interceptor, 所有拦截器连成一个Interceptor.Chain, 环环相扣,完成一次网络请求。

拦截器种类:

RetryAndFollowUpInterceptor:  负责重试和重定向

BridgeInterceptor: 先将应用层数据类型转换为网络调用层的数据类型, 然后将网络层返回的数据类型转换为应用层的数据类型。

CacheInterceptor: 负责读取缓存,更新缓存

ConnectInterceptor: 负责与服务器建立连接

NetworkInterceptor:  client 设置的networkInterceptor

CallServerInterceptor: 负责向服务器发送请求数据,从服务器读取响应数据。

 

参考:

https://www.jianshu.com/p/310ccf5cbea6

 

 

你可能感兴趣的:(andoid基础)