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 ( 网络拦截器) 对请求依次处理,与服务建立连接后,获取返回上诉拦截器依次处理后,最后将结果返回给调用方。

流程图如下:

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

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
OkHttp 是一个非常流行的 HTTP 客户端库,它支持 HTTP/2 和 SPDY,提供了一个简单、易用的 API,能够轻松地完成网络请求。同时,OkHttp 还提供了对 WebSocket 的支持,可以用来编写基于 WebSocket 的应用程序。 以下是一个使用 OkHttp 实现 Socket 通信的简单示例: ```java import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.Response; import okhttp3.WebSocket; import okhttp3.WebSocketListener; import okio.ByteString; public class SocketExample { public static void main(String[] args) { OkHttpClient client = new OkHttpClient(); Request request = new Request.Builder() .url("ws://echo.websocket.org") .build(); WebSocket socket = client.newWebSocket(request, new WebSocketListener() { @Override public void onOpen(WebSocket webSocket, Response response) { webSocket.send("Hello, World!"); webSocket.send(ByteString.decodeHex("deadbeef")); } @Override public void onMessage(WebSocket webSocket, String text) { System.out.println("Received message: " + text); } @Override public void onMessage(WebSocket webSocket, ByteString bytes) { System.out.println("Received bytes: " + bytes.hex()); } @Override public void onClosing(WebSocket webSocket, int code, String reason) { webSocket.close(1000, null); System.out.println("Closing: " + code + " " + reason); } @Override public void onFailure(WebSocket webSocket, Throwable t, Response response) { t.printStackTrace(); } }); } } ``` 在这个示例,我们首先创建了一个 OkHttpClient 对象,然后创建了一个 Request 对象,指定了 WebSocket 的 URL。接着,我们调用 OkHttpClient 的 newWebSocket 方法,把 Request 对象和一个 WebSocketListener 对象传递进去。在 WebSocketListener ,我们实现了 onOpen、onMessage、onClosing 和 onFailure 四个方法,分别处理 WebSocket 打开、接收消息、关闭和出错的情况。 在 onOpen 方法,我们调用 WebSocket 的 send 方法发送消息,可以是字符串或二进制数据。在 onMessage 方法,我们打印接收到的消息,可以是字符串或二进制数据。在 onClosing 方法,我们手动关闭 WebSocket 连接。在 onFailure 方法,我们打印出异常信息。 需要注意的是,这个示例只是一个简单的演示,实际应用,需要根据具体的需求来实现 WebSocket 的逻辑。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值