Android技能树 — 网络小结(6)之 OkHttp超超超超超超超详细解析

本文详细介绍了Android开发中的网络库OkHttp,包括Call相关操作、请求分发Dispatcher的同步和异步处理,以及OkHttp的拦截器机制。通过对OkHttp源码的分析,揭示了网络请求的内部流程,帮助开发者深入理解Android性能优化。
摘要由CSDN通过智能技术生成

安卓开发大军浩浩荡荡,经过近十年的发展,Android技术优化日异月新,如今Android 11.0 已经发布,Android系统性能也已经非常流畅,可以在体验上完全媲美iOS。

但是,到了各大厂商手里,改源码、自定义系统,使得Android原生系统变得鱼龙混杂,然后到了不同层次的开发工程师手里,因为技术水平的参差不齐,即使很多手机在跑分软件性能非常高,打开应用依然存在卡顿现象。

另外,随着产品内容迭代,功能越来越复杂,UI页面也越来越丰富,也成为流畅运行的一种阻碍。综上所述,对APP进行性能优化已成为开发者该有的一种综合素质,也是开发者能够完成高质量应用程序作品的保证。

为此,我把阿里、腾讯、字节跳动、美团等公司Android性能优化实战整合成了一个PDF文档,由于内容过多的,我先介绍实战部分,之后再介绍理论部分。

public final class Request {
final HttpUrl url; //网络请求路径
final String method; //get、post…
final Headers headers;//请求头
final @Nullable RequestBody body;//请求体
/**
你可以通过tags来同时取消多个请求。
当你构建一请求时,使用RequestBuilder.tag(tag)来分配一个标签。
之后你就可以用OkHttpClient.cancel(tag)来取消所有带有这个tag的call。.
*/
final Map<Class<?>, Object> tags;



}

这个估计很多人都清楚,如果对请求头请求体等不清楚的,可以看下以前我们这个系列的文章:[Android技能树 — 网络小结(3)之HTTP/HTTPS](()

2.3 Call相关

我们可以看到我们生成的Request实例,会传给OkHttpClient实例的newÇall方法:

Request request = new Request.Builder().url(url).build();
Call call = okHttpClient.newCall(request);
call.execute();或者 call.enqueue(…);

我们Request和OkHttpClient大致都了解过了,我们来具体看下newCall执行了什么和Call的具体内容。

Call类代码:

@Override public Call newCall(Request request) {
return RealCall.newRealCall(this, request, false /* for web socket */);
}

RealCall类代码:
static RealCall newRealCall(OkHttpClient client, Request originalRequest, boolean forWebSocket) {
// Safely publish the Call instance to the EventListener.
RealCall call = new RealCall(client, originalRequest, forWebSocket);
call.eventListener = client.eventListenerFactory().create(call);
return call;
}

我们可以看到,最后获取到的是RealCall的实例,同时把我们各种参数都配置好的OkHttpClient和Request都传入了。

所以后面call.execute()/call.enqueue()都是执行的RealCall的相对应的方法。但目前位置我们上面的图已经讲解好了,我这里再贴一次:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vzblsa8m-1649662193340)(https://user-gold-cdn.xitu.io/2018/11/4/166dea0866cbbb48?imageView2/0/w/1280/h/960/ignore-error/1)]

恭喜你,下次别人考你Okhttp前面的相关参数配置方面的代码你已经都理解了。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YMPPMmsB-1649662193341)(https://user-gold-cdn.xitu.io/2018/11/13/1670b21751eafe73?imageView2/0/w/1280/h/960/ignore-error/1)]

3.请求分发Dispatcher

我们继续看我们的流程图下面的内容:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xsvX0cbL-1649662193342)(https://user-gold-cdn.xitu.io/2018/11/13/1670bdac1f65f61d?imageView2/0/w/1280/h/960/ignore-error/1)]

3.1 Dispatcher 同步操作

我们先来讲同步执行:

@Override
public Response execute() throws IOException {
synchronized (this) {
if (executed) throw new IllegalStateException(“Already

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值