Okhttp 框架使用和源码分析

WORK_QUEUE_ITEM 介绍      window 内核中有很多成熟的设计, WORK_QUEUE_ITEM 就是其中的一个。 这个设计的思想很简单,就是把要处理的任务扔到一个队列中,系统会自动调度处理这些任务。         WORK_QUEUE_ITEM 的结构很简单:     typedef struct _WORK_QUEUE_ITEM {       LIST_ENTRY  List;  //用 阅读详情

近期学习了网络框架Rretrofit 和其依赖的底层Okhttp.
这里做一些整理。

首先网络框架的最根本的流程

1.request —–executor ———–Httpcall |
callback- —————————————|
所以分析是基于这三个基本模块进行分析的,收先是发起一个请求,然后交给执行器,执行器执行后,返回一个回调。
根据这个思路我们开始分析Okhttp
1.request
使用时我们通过 :

//创建一个Request
final Request request = new Request.Builder()
                .url("https://github.com/hongyangAndroid")
                .build();           
                这种方式创建一个Request 

2.通过:

     OkHttpClient okHttpClient = new OkHttpClient();
    OkHttpClient newClient = okHttpClient.newBuilder()
            .cache(provideCache())
            .connectTimeout(20, TimeUnit.SECONDS)
            .readTimeout(20, TimeUnit.SECONDS)
            .build();
        这种方式创建一个executor

3. 通过

new Callback()
        {
            @Override
            public void onFailure(Request request, IOException e)
            {
            }

            @Override
            public void onResponse(final Response response) throws IOException
            {
                    //String htmlStr =  response.body().string();
            }
        }

这些代码缠产生一个回调。
4. 通过 client.exqueue()这个方法进行异步调用

下面开始分析这些代码背后的原理。

首先上一张流程图:
这里写图片描述

Okhttp request

看源码可以知道
requeset 主要是对请求的URL header body 等信息进行的封装

    this.url = builder.url;
    this.method = builder.method;
    this.headers = builder.headers.build();
    this.body = builder.body;
    this.tag = builder.tag != null ? builder.tag : this;

这里不是重点,但是这个地方在后面Retrofit 进行了注解的更高级解耦.

okhttp中executer
最重要的环节就是和executer这部分 也就是OkhttpClient
阅读源码:
我们知道这个OkhttpClient 采用的是建造者模式进行的建造,

//new call
Call call = mOkHttpClient.newCall(request); 

当进行newCall这个方法之后就要执行这个Requset请求了 我们深入去看这个newCall 方法可以看到进入了一个realcall这个类,这个类就是核心类。
我们知道请求分为两种 同步和异步
通过阅读源码,同步:

 Response result = getResponseWithInterceptorChain(false);

通过getResponseWithInterceptorchain 方法返回最终的Response

异步:
是通过 disapcach 这个类中的exqueue方法执行的,可以发现这个disapach 构造器生成一个线程池,并还包含3个队列。
三个队列分别为

  • readyAsyncalls 等待队列
  • runningAsynacalls 运行时第异步队列
  • runningSyncall 运行时同步队列。

  • 而最终 执行的这个对象
client.dispatcher().enqueue(new AsyncCall(responseCallback, forWebSocket));

Asyncall 实际上是一个Runnble对象 ,放入该线程池中执行的run方法还是自己的exqueue方法。 可以看到最终执行的方法仍然是
getResponseWithInterceptorChain(false);
这个方法。

殊途同归。最终都走到了这个方法中,那么这个方法则真正的获取response 和 过滤器列表的方法了。着重看这个方法。
这可以看到,其中利用了 责任链模式,环环递进,最终返回Response。

依次说以下各个拦截器的作用
1. 重定向拦截器
2. BidgeInterCepter—–Gzip 压缩 和头数据的补全,负责把用户构造的请求转换为发送到服务器的请求、把服务器返回的响应转换为用户友好的响应的 (返回代号等)。
3. CatchInterCepter—–取当初设置的缓存。catch中设置的缓存
4. connectIntercepTer –2.0 或1.0用不同的Httpstream
5. callServiceIntercepter
6. okio ————-里面用socket请求的

Okhttp中Response

真正的请求
内部是使用socket 方式请求的这里还没看到。

其中的缓存部分
而具体的缓存逻辑 OkHttp 内置封装了一个 Cache 类,它利用 DiskLruCache。按照 LRU 算法进行缓存淘汰。
如何设置缓存:

OkHttpClient okHttpClient = new OkHttpClient();
    OkHttpClient newClient = okHttpClient.newBuilder()
            .cache(provideCache())
            .build();

设置了缓存目录。

也可以自行实现 InternalCache 接口,在构造 OkHttpClient 时进行设置,这样就可以使用我们自定义的缓存策略了。

public class CacheInterceptor implements Interceptor {
    @Override
    public Response intercept(Chain chain) throws IOException {
        Request request = chain.request();
        Response response = chain.proceed(request);
        Response response1 = response.newBuilder()
                .removeHeader("Pragma")
                .removeHeader("Cache-Control")
                //cache for 30 days
                .header("Cache-Control", "max-age=" + 3600 * 24 * 30)
                .build();
        return response1;
    }
}

okhttp缓存设置参考文章:http://blog.youkuaiyun.com/copy_yuan/article/details/51524907

这就是Okhttp大致的请求流程。

可见Okhttp主要是在请求头 ,过滤器等方面进行的处理。

参考文章:
http://blog.piasy.com/2016/07/11/Understand-OkHttp/
http://www.open-open.com/lib/view/open1472216742720.html

Android 第三方框架:网络框架:OkHttp:源码分析:缓存 不存在内存缓存,只存在磁盘缓存磁盘缓存。 阅读详情

相关推荐

Okhttp源码分析&实践(四)【Okhttp的整体框架和基本源码分析】

前面几章,我们学习了http的基础知识,服务端的基础知识、服务端测试Demo的实践编写,本章开始,我们正式开始Okhttp的框架源码学习和实践,大家要紧跟脚步哦,建议大家,可以跟随小编,一点一点的敲一下文章中的代码,相信通过这个系列学习,您不单单会获得okhttp的源码实践知识,更多的可能,会总结得到一份自我学习、实践的方式方法。 1.从使用入手,初探源码 我们先从okhttp的经典使用入手,试着了解、猜测一下okhttp的整体实现逻辑。 OkHttpClient okHttpClient =

itbird的专栏 1076

网络底层框架:OkHttp 实现原理

OkHttp3简单使用教程(一):请求和响应 https://www.jianshu.com/p/f3f228d3598c \n HTTP请求报文主要由请求行、请求头部、请求正文3部分组成. 请求行:由请求方法,URL,协议版本三部分构成,之间用空格隔开 请求 Content-Language 请求zhengwen /n 23 URL带的参数 HTTP响应报文格式: HTTP响应报文主要由状态行、响应头部、响应正文3部分组成 HTTP响应报文主要由状态行、响应头部、响应正文3部分组...

疾风剑豪 1083

Okhttp源码分析&实践(七)【 实践环节:Okhttp下载功能的实现】

本章从下载的功能需求,到下载框架的设计、开发、运行调试,花费了不少精力。也许一切看上去那么简单,但是从需求、设计、编码、调试,小编中间犯了很多低级的错误,所以每件事情,我们还是要动手去做,可能一些东西并非看上去那么简单,只有自己遇到了,并且利用所学所思,解决了问题或者需求,也许这些知识才真正属于我们自己。

itbird的专栏 966

android面试(12)-Okhttp

可以说,okhttp非常的火,火了好几年了,虽然现如今比较火的网络框架是retrofit,但是,retrofit内部其实也是用了okhttp;1.使用方法:(1)创建一个请求客户端okhttpClient对象(2)创建一个请求Request对象,通过Build模式创建(3)创建一个实际的http请求call对象,它可以调用execute(同步获取数据),也可以调用enqueue(异步获取数据);p...

pgg_cold的博客 4406

Android息屏后台任务保活实战:从定时器失效到厂商白名单破解

本文深入探讨了Android应用在息屏后定时任务失效的根源,即系统为省电而触发的休眠机制。文章提供了从传统方案失效分析到实战破解的完整路径,核心在于引导用户将应用加入电池优化白名单并开启自启动权限,从而合法绕过限制。同时,结合WorkManager、AlarmManager等可靠定时方案,实现稳定的后台任务执行。

weixin_28475533的博客 421

Comsol&Matlab 亥姆霍兹共振消声器传递损失理论解与仿真解

当外界噪声以共振频率进入共振器时,共振器内的空气质量发生周期性的振动,从而减少或消除噪声。当特定频率的声波进入共振器时,共振器的空气质量会发生周期性的振动,从而实现对该频率的噪声的减弱或消除。5. 反射和吸收:共振器的几何形状和容积还可以影响共振器内空气振动的反射和吸收。然而,对于不同频率的噪声,需要相应调整共振器的参数以匹配新的共振频率。3. 腔体内的空气振动:当特定频率的声波进入共振器时,共振器内的空气质量会发生振动。2. 声波进入共振器:外界的声波通过共振器的颈部进入共振器的封闭空腔。

声学黑洞仿真工作室 4573

OKHttp网络框架源码解析(一)okHttp框架同步异步请求流程和源码分析

首先看下简单使用 1.github官网:https://square.github.io/okhttp/ 2.添加依赖:compile ‘com.squareup.okhttp3:okhttp:3.10.0’ 3.同步请求 OkHttpClient okHttpClient=new OkHttpClient.Builder().readTimeout(5000, TimeUnit.S...

奋斗&努力 425

PyTorch复现PSMNet踩坑全记录:从环境配置到KITTI数据集训练

本文详细记录了使用PyTorch复现CVPR经典立体匹配模型PSMNet的全过程,从环境配置到KITTI数据集训练,特别针对2023年主流软硬件环境中的常见问题提供解决方案。文章重点介绍了PSMNet的金字塔池化模块和堆叠沙漏结构,帮助研究者和工程师快速实现工业级深度估计,节省大量试错时间。

weixin_30897233的博客 326

okhttp框架 同步请求流程和源码分析

创建Client的外部调用 OKHttpClient client = new OkHttpClient.Builder().readTimeOut(5,TimeUnit.SECONDS).build(); 先来看下OkHttpClient的内部类Builder的构造方法: public Builder() { dispatcher = new Dispatcher(...

Seas.Su的博客 411

手把手教你理解ARM SoC中的PPU:电源管理IP的配置与实战避坑指南

本文深入解析ARM SoC中的PPU(Power Policy Unit)电源管理IP,提供详细的配置指南与实战避坑技巧。从PPU基础架构、寄存器配置到与PCSM的协同工作,全面介绍如何优化电源管理策略,解决常见配置误区,并分享高级调试与性能优化方法,助力工程师提升低功耗SoC设计效率。

weixin_28693447的博客 479

到底什么是Harness工程?一篇文章从入门到企业落地全解析

随着OpenClaw爆火,Harness Engineering(驾驭工程)成为AI编程时代的热门概念,很多小白对其感到陌生。本文用通俗类比和真实案例,避开复杂术语,从基础定义入手,讲清Harness Engineering的核心逻辑——人类工程师设计“约束系统”(马具),让AI模型(烈马)安全高效地完成代码工作,同时拆解其核心组件、企业落地场景和实战成果,帮小白快速入门,读懂这项能解放人力、提升效率的新技术,轻松掌握它的核心价值和落地思路。

program哲学 3259

okhttp源码分析

一、okhttp简介 OKHttp是一个处理网络请求的开源项目,Android 当前最火热网络框架,由移动支付Square公司贡献,用于替代HttpUrlConnection和Apache HttpClient(android API23 6.0里已移除HttpClient)。现在在Android开发中最火的应用最多的联网框架毫无疑问是okhttp,目前已经大量替代了Volley、HttpUrlC...

weixin_33862188的博客 250

YOLOv13改进策略【注意力机制篇】| ICASSP 2023 EMA 高效多尺度注意力,跨空间学习提高远距离建模依赖

ICASSP 2023 EMA 高效多尺度注意力在 YOLOv13 的接入实战:跨空间学习提升远距离依赖建模,含原理图解、完整代码、yaml 配置与实测参数量对比(ultralytics 8.3.63)。

qq_53329130的博客 932

深入解析OkHttp3

OkHttp是一个精巧的网络请求库,有如下特性: 1)支持http2,对一台机器的所有请求共享同一个socket 2)内置连接池,支持连接复用,减少延迟 3)支持透明的gzip压缩响应体 4)通过缓存避免重复的请求 5)请求失败时自动重试主机的其他ip,自动重定向 6)好用的API其本身就是一个很强大的库,再加上Retrofit2、Picasso的这一套组合拳,使其愈发的受到开发者的关注

一个码农的博客 6万+

YOLO算法:关于目标检测算法的基本介绍(小白入门必读)

目标检测算法是一种计算机视觉算法,用于在图像或视频中识别和定位特定的目标物体。本节课就给大家重点介绍下基于深度学习的目标检测算法!

小哥谈 2524

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Okhttp同步请求源码分析

进阶android,OKhttp源码分析——同步请求的源码分析 OKhttp是我们经常用到的框架,作为开发者们,我们不单单要学会灵活使用,还要知道他的源码是如何设计的。 今天我们来分析一下OKhttp 同步请求的执行流程和源码分析 so,老样子,我们先来一张图 从上图可以看出,不管是同步请求还是异步请求,我们都需要创建一个OKhttpClient对象,用到的是build构造者模式,创建Reque...

这个时代,作为程序员可能要学习小程序 629

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

okhttp依赖_你必须学会的OkHttp(首篇)

引子OkHttp 知名第三方网络框架SDK,使用简单,性能优秀,但是内核并不简单,此系列文章,专挑硬核知识点详细讲解. 何为硬核,就是要想深入研究,你绝对绕不过去的知识点正文大纲OkHttp是什么?OkHttp怎么用?OkHttp源码核心类之一:分发器详解OkHttp源码核心类之一:拦截器简述正文OkHttp是什么OkHttp是时下非常流行的网络编程框架,由行业巨佬 Square公司开源...

weixin_39878401的博客 3312

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

android okhttp源码分析

okhttp是Square公司开发贡献的,其功能强大,现在是安卓主流网络框架。 现在我们就看看这个框架牛逼之处,探究其源码。 compile 'com.squareup.okhttp3:okhttp:3.8.0' 我们分析的版本是3.8.0. public class OkHttpClient implements Cloneable, Call.Factory, WebSocket.F...

atxxiang4的博客 717

Retrofit+okhttp3使用,附带源码解析

复盘网路请求Retrofit+okhttp的简单使用,据了解,最新技术Retrofit+okhttp+moshi+kotlin协程可实现的网络请求框架更易扩展,健壮。后续还要学习。

1899

重识OkHttp:从深入了解到源码分析

作者博客http://www.jianshu.com/u/16925b46816d前言本文的分析基于OkHttp3.4,不展示完整的代码示例,具体可以看这个官方例子或者项目中的例...

陈宇明 110

OKHttp网络框架源码解析

OKHttp网络框架源码解析

qq_15274383的博客 686

揭秘Android常用三方框架源码-okhttp

okhttp是一个处理网络请求的开源项目,是安卓端最火热的轻量级框架,由移动支付Square公司贡献(该公司还贡献了Picasso) 用于替代HttpUrlConnection和Apache HttpClient。作为常用框架,无论是从使用还是面试方面,我们都有必要了解其源码实现,不能仅停留在api的调用层面。 在讲解其源码之前,先来简单回顾一下okhttp的使用。 一、基本使用 1.1 导入 通过gradle引入依赖 implementation 'com.squareup.okhttp3:okhttp.

m0_58350991的博客 320

OkHttp框架(二)

OkHttp框架异步请求的执行流程及源码分析enqueue()ExecutorServiceexecute 异步请求的执行流程及源码分析 1.判断当前call是否仅仅只被执行一次 2.封装成了AsyncCall对象 3.调用client.dispatcher().enqueue() call.enqueue(new Callback() { @Override ...

qq_40384370的博客 171

OkHttp3源码之我见

源码分析基于:OkHttp3.14.7进行。 对于Android开发者而言,网络请求不可避免。我们使用的最多的就是Square的OkHttp3框架。关于这个框架使用的时间很长,正好前一段时间有点时间,就利用业余时间仔细阅读了该框架的源码,现在就把阅读过程中自己的感悟写下来分享给大家。 一、使用场景: 对于OkHttp3有两种网络请求的方式,一种是同步请求的方式;一种就是异步请求的方式。 1...

知识改变命运~ 1390

OKHttp开源框架学习七:缓存策略源码分析

目录 系列文章: 代码体现: Cache类的put方法: Cache类的get方法: 系列文章: OKHttp开源框架学习一:同步请求总结 OKHttp开源框架学习二:异步请求总结 OKHttp开源框架学习三:任务调度核心类Dispatcher OKHttp开源框架学习四:拦截器 OKHttp开源框架学习五:拦截器之RetryAndFollowUpInterceptor OK...

songzi1228的博客 324
上一篇: ARP嗅探和抓包学习
下一篇: universal-image-loader框架的再次封装使用
Nela
博客等级 码龄11年 9粉丝 71原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值