安卓开发大军浩浩荡荡,经过近十年的发展,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