范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

Androidokhttp原理详解,搞懂去虐面试官

  作者:小红军storm一、okhttp工作的大致流程
  1.1、整体流程当我们通过OkhttpClient创建一个Call,并发起同步或异步请求时;  okhttp会通过Dispatcher对我们所有的RealCall(Call的具体实现类)进行统一管理,并通过execute()及enqueue()方法对同步或异步请求进行处理;  execute()及enqueue()这两个方法会最终调用RealCall中的getResponseWithInterceptorChain()方法,从拦截器链中获取返回结果;  拦截器链中,依次通过RetryAndFollowUpInterceptor(重定向拦截器)、BridgeInterceptor(桥接拦截器)、CacheInterceptor(缓存拦截器)、ConnectInterceptor(连接拦截器)、CallServerInterceptor(网络拦截器)对请求依次处理,与服务的建立连接后,获取返回数据,再经过上述拦截器依次处理后,最后将结果返回给调用方。
  提供两张图便于理解和记忆:
  okhttp整体流程1
  okhttp整体流程2
  这张图只画出了请求流程,没有数据返回流程,后期会处理。
  1.2、各大拦截器的原理解析1.2.1、RetryAndFollowUpInterceptor:负责重定向
  构建一个StreamAllocation对象,然后调用下一个拦截器获取结果,从返回结果中获取重定向的request,如果重定向的request不为空的话,并且不超过重定向最大次数的话就进行重定向,否则返回结果。
  注意:这里是通过一个while(true)的循环完成下一轮的重定向请求。
  (1)、StreamAllocation为什么在第一个拦截器中就进行创建?
         便于取消请求以及出错释放资源。
  (2)、StreamAllocation的作用是什么?
         StreamAllocation负责统筹管理Connection、Stream、Call三个实体类,具体就是为一个Call(Realcall),寻找( findConnection() )一个Connection(RealConnection),获取一个Stream(HttpCode)。
  1.2.2、BridgeInterceptor
  负责将原始Requset转换给发送给服务端的Request以及将Response转化成对调用方友好的Response。
  具体就是对request添加Content-Type、Content-Length、cookie、Connection、Host、Accept-Encoding等请求头以及对返回结果进行解压、保持cookie等。
  1.2.3、CacheInterceptor
  CacheInterceptor:负责读取缓存以及更新缓存。
  在请求阶段:  读取候选缓存cacheCandidate;  根据originOequest和cacheresponse创建缓存策略CacheStrategy;  根据缓存策略,来决定是否使用网络或者使用缓存或者返回错误。
  具体的的缓存策略就是http的缓存策略,详见下图:
  在结果返回阶段:
  负责将网络结果进行缓存(使用于DiskLruCache)。
  okhttp&http缓存策略
  强制缓存:当客户端第一次请求数据时,服务端返回了缓存的过期时间(Expires与Cache-Control),没有过期就可以继续使用缓存,否则则不适用,无需再向服务端询问。
  对比缓存:当客户端第一次请求数据时,服务端会将缓存标识(Etag/If-None-Match与Last-Modified/If-Modified-Since)与数据一起返回给客户端,客户端将两者都备份到缓存中 ,再次请求数据时,客户端将上次备份的缓存标识发送给服务端,服务端根据缓存标识进行判断,如果返回304,则表示缓存可用,如果返回200,标识缓存不可用,使用最新返回的数据。ETag是用资源标识码标识资源是否被修改,Last-Modified是用时间戳标识资源是否被修改。ETag优先级高于Last-Modified。
  1.2.4、ConnectInterceptor:负责与服务器建立连接
  使用StreamAllocation.newStream来和服务端建立连接,并返回输入输出流(HttpCodec),实际上是通过StreamAllocation中的findConnection寻找一个可用的Connection,然后调用Connection的connect方法,使用socket与服务端建立连接。
  1.2.5、CallServerInterceptor:负责从服务器读取响应的数据
  主要的工作就是把请求的Request写入到服务端,然后从服务端读取Response。写入请求头写入请求体读取响应头读取响应体二、连接池原理
  由于HTTP是基于TCP,TCP连接时需要经过三次握手,为了加快网络访问速度,我们可以Reuqst的header中将Connection设置为keepalive来复用连接。
  Okhttp支持5个并发KeepAlive,默认链路生命为5分钟(链路空闲后,保持存活的时间),连接池有ConectionPool实现,对连接进行回收和管理。
  2.1、连接池的清理
  连接池清理1
  ConectionPool在内部使用一个异步线程来清理连接。
  当连接池中有连接时:清理任务由cleanup()方法完成,首先执行清理,并返回下次需要清理的间隔时间,调用调用wait() 方法释放锁。等时间到了以后,再次进行清理,并返回下一次需要清理的时间间隔,再次进入wait,以此循环往复。
  当连接池中没有连接时:cleanup()返回-1,跳出循环,下次有连接加进来时,再次开启线程进行循环清理。
  之所以连接池线程可以跳出循环,是因为,他是子线程,而looper选择一直阻塞是因为他是主线程,如果跳出,程序执行结束。
  连接池原理2首先统计空闲连接数量;  然后通过for循环查找最长空闲时间的连接以及对应空闲时长;  然后判断这个最长空闲时间的连接是否超出最大空闲连接数或者或者超过最大空闲时间,满足其一则清除最长空闲的连接。如果不满足清理条件,则返回一个对应等待时间。
  这个对应等待的时间又分二种情况:  有空闲连接:则返回:keepAliveDurationNs-longestIdleDurationNs;  没有空闲的连接,则返回:keepAliveDurationNs
  注意:清除一个空闲连接后,会返回0,再次立即开始清理。
  如何统计空闲连接呢?
  统计空闲连接
  StreamAllocation创建或者复用一个Connection后,会将自己添加到Connection的connection.allocations列表中,数据读取完毕之后,会将自己从Connection的connection.allocations中移除,所以判读一个Connection是否是空闲连接可以采用引用计数法,判断connection.allocations列表中是否有StreamAllocation,如果没有就是空闲连接,否则不是。
  三、OkHttp中Dispatcher和线程池
  3.1、OkHttp中线程池public synchronized ExecutorService executorService() {     if (executorService == null) {       executorService = new ThreadPoolExecutor(0, Integer.MAX_VALUE, 60, TimeUnit.SECONDS,           new SynchronousQueue(), Util.threadFactory("OkHttp Dispatcher", false));     }     return executorService;   }
  OkHttp中的线程池是一个 newCachedThreadPool。
  所以在 OkHttp 中线程池只是一个辅助作用,仅仅是用来做线程缓存,便于复用的。
  真正控制请求并发数量和执行时机是通过调度器 Dispatcher 完成的。
  3.2、OkHttp中Dispatcher
  RealCall.executeRealCall.execute
  先将RealCall加入Dispatcher的runningSyncCalls队列,然后调用getResponseWithInterceptorChain获取Response,最后调用Dispatcher的finished方法,将自身从runningSyncCalls移除,然后进行轮询readyAsyncCalls队列,取出ready的异步任务在满足条件的情况下进行执行。
  RealCall.enqueueRealCall.enqueue
  如果当前正在执行的RealCall的数量小于最大并发数maxRequest(64),并且该call对应的Host上的call小于同一host上的最大并发数maxRequestsPerHos(5),则将该call加入runningAsyncCalls,并将这个call放到线程池中进行执行,否则加入readyAsyncCall排队等待。
  注意:
  同步请求和异步请求执行完成之后,都会调用dispatcher的finished方法,将自身从对应的队列中移除,然后进行轮询readyAsyncCalls队列,取出ready的异步任务在满足条件下放到线程池中执行。
  轮询readyAsyncCallsDispatcher.中的并发数量及三个队列的作用
  maxRequests = 64 // 最大并发请求数为64
  maxRequestsPerHost = 5 //每个主机最大请求数为5
  ExecutorService executorService //消费者池(也就是线程池)
  Deque readyAsyncCalls:// 异步的缓存,正在准备被消费的(用数组实现,可自动扩容,无大小限制)
  Deque runningAsyncCalls //正在运行的 异步的任务集合,仅仅是用来引用正在运行的任务以判断并发量,注意它并不是消费者缓存
  Deque runningSyncCalls //正在运行的,同步的任务集合。仅仅是用来引用正在运行的同步任务以判断并发量  四、OkHttp中的设计模式
  责任链模式:拦截器链
  单例模式:线程池
  观察者模式:各种回调监听
  策略模式:缓存策略
  Builder模式:OkHttpClient的构建过程
  外观模式:OkHttpClient封装了很多类对象
  工厂模式:Socket的生产  五、OkHttp的优势
  5.1、功能方面:
  功能全面,满足了网络请求的大部分需求。
  5.2、网络优化方面:内置连接池,支持连接复用  支持gzip压缩响应体  通过缓存避免重复的请求  支持http2,对一台机器的所有请求共享同一个socket
  5.3、扩展性方面:
  拦截器模式使得我们很容易使得我们很容易添加一个自定义拦截器对请求和返回结果进行处理。  最后
  在这里就再分享一份由大佬亲自收录整理的Android学习PDF+架构视频+面试文档+源码笔记,高级架构技术进阶脑图、Android开发面试专题资料,高级进阶架构资料
  这些都是我现在闲暇时还会反复翻阅的精品资料。里面对近几年的大厂面试高频知识点都有详细的讲解。相信可以有效地帮助大家掌握知识、理解原理,帮助大家在未来取得一份不错的答卷。
  当然,你也可以拿去查漏补缺,提升自身的竞争力。
  真心希望可以帮助到大家,Android路漫漫,共勉!
  如果你有需要的话,只需私信我【进阶】即可获取

苹果13or12s机模曝光图,苹果的操作一如既往距离苹果新iphone发布越来越近,果粉们的心一定是非常期待,但是苹果一如既往的熟练手法可能让果粉失望了。此前,从华强北流出了苹果13or12s的机模图片,已经出现在各大媒体平台。Windows11预览版不止有蓝屏,还会出现绿屏与黑屏死机也有护眼模式与夜间模式。Windows系统崩溃死机时出现蓝屏的机制,在英语里称作BSOD,即蓝屏死机BlueScreenOfDeath的缩写,是任何Windows用户避之不及的估值与市值全解析滴滴的资本市场教育课崔桂林文常言道,丑媳妇总要见公婆。其实,新娘子哪有不精心妆扮自己的?画眉深浅入时无可能更符合新娘待拜高堂时期待而又敏感不安的心情。滴滴当然不是丑媳妇,相反,作为有史以来中国互联网企低配高价手机多是有原因的!数据显示线下渠道是手机销售主力在首创具有超高性价比的互联网手机模式后,小米一举成为了全球的手机大厂,而就此互联网手机也开始了疯狂的发展,包括很多国产老牌厂商在内,几乎每家都有针对线下渠道的子品牌。当然了,虽然线亚马逊销量TOP10品牌TOZO产品怎么样?体验一款耳机看看近年来,我国跨境电商行业不断发展,市场规模持续扩大,2015年2020年年均增速明显。近期,由我爱音频网联合主办的2021中国跨境电商3C配件选品大会汇集了众多跨境电商企业,并达成最近有那么多真无线耳机新品选购时该关注什么?最近几个月,厂商推出了不少真无线耳机新品。我们在选购真无线耳机的时候,多了很多选择。真无线耳机虽然看着很简单,但实际上选购时还是有很多值得注意的地方。佩戴体验佩戴舒适度是选购一款真挂耳式耳机推荐,不需要入耳的蓝牙耳机不管是出去跑步,还是骑车,带不带耳机总是一个矛盾的事情。戴上耳机后耳塞会堵住耳朵,你将无法及时有效的接收外界的声音信息,这对于户外运动来说是非常危险的。但是在骨传导耳机出现之后,这无线耳机性价比之选HIKZ1S无线耳机入手体验作为一个运动爱好者,跑步时听音乐是我的习惯。作为一个数码产品的伪粉丝,我最近就入手了一款HIKZ1S无线耳机,从外观颜值到音质效果,都让我十分惊喜,具体表现如何呢,一起来体验一下吧暑期到,休闲来,给游戏加点料,升级电竞耳机力保游戏段位时间的数字不知不觉已经拨到下半年七月来到,正式宣告盛夏来临的同时,也是迎来毕业季。学生时代已经是十几年前,现在想来仍有一些唏嘘感叹想念那时候多彩的生活,还有无忧无虑的闲适自得。以前2000多的大内存手机值不值得买?值得,有时候别被价格唬住了,要仔细看配置。比如12G256GB的真我Q3Pro狂欢版。有拓展内存,最高7G,这运行速度就跟坐火箭一样。还有就是这256G的内存,这不是想下啥就下啥。第三代芯片材料!碳化硅能耗低性能强,中国或将实现国产替代经常关注科技圈的朋友们一定知道,芯片半导体是决定产品技术性能的关键。今年以来,全球芯片半导体极度紧缺,以至于很多行业,尤其是汽车手机智能家电等,都面临着缺货断货的艰难困境。如果芯片
H12Datacom题库判断题汇总一1主机在访问服务器的web服务器时,网络层protocol字段取值为6。(A)A。TrueB。False2华为AR路由器的命令行界面下,save命令的作用是保存当前的系统时间。(B大型强子对撞机重启据合众国际社4月22日报道,欧洲核子研究中心的科学家们周五重启了大型强子对撞机。这台世界上最强大的粒子加速器在3年前因维修和升级而暂停。欧洲核子研究中心说,第一批质子束开始以相反方蓝净领互联网新动态网络大环境下,直播行业越来越火热,尤其受疫情影响,户外流动人数受到控制,这给了网络直播一席之地,直播行业由此兴起。蓝净领也紧跟直播热潮,免去加盟商后顾之忧,没办法到店没关系,路途遥谈谈自然界三个伟大的守恒定律我们知道,功和能量是有密切联系的,但又是有区别的。功是能量变化与转换的一种量度,是和变换过程联系在一起的而能量是代表物体系统在一定状态下,所具有的作功本领,它和物体系统的状态有关,索爱手机重出江湖?外观神似iPhone13Pro,还是陈小春代言现在大家买手机,都会选择智能手机,即便是为家中老人购机,也不会再考虑只能打电话发短信的功能机了。手机不仅仅只是一个通讯设备,而是工作生活娱乐都离不开的重要工具。在功能机时代,诺基亚直降2999元,骁龙87065W闪充4500mAh,来看这款手机怎么样现如今除了小米之外,国内最大的安卓手机厂商莫过于OPPO了,这两年凭借着子品牌的崛起,比如一加和realme,销量绝对能在国内排名前10。OPPO的机型,最大的特点就是品质不错,产为何日本电商干不过实体店,国内却是相反?内行一言道破在互联网时代下,人们生活方方面面都离不开互联网的帮助,尤其是互联网的发展对于人们的购物方式带来了极大的改变,与传统的购物方式相比,现在人们更喜欢网上购物。电子商务是近些年来一个十分易周金融观点个人养老金制度正式出炉易观分析数字经济全景白皮书浓缩了易观分析对于数字经济各行业经验和数据的积累,并结合数字时代企业的实际业务和未来面临的挑战,以及数字技术的创新突破等因素,最终从数字经济发展大势以及各vivoS15新机入网据数码博主WHYLAB消息,vivo旗下有两款新机通过了国家质量认证,型号分别为V2199GA和V2203A,其中V2199GA支持80W快充,V2203A支持66W快充。V2203月问界M5销量3045台距离年销30万辆还有多远?说起国内新势力造车,除去蔚小理外,最近流量不错的就要数赛力斯了,不过流量并不是来自赛力斯品牌自己,而是合作伙伴华为,赛力斯作为与华为深度合作的车企,首款产品赛力斯SF5虽然有华为的台积电三星都要进入3nm了,中芯国际却1200亿扩产28nm?目前全球最先进的晶圆厂商就是台积电和三星了。三星目前已经在试产3nm的芯片了,而台积电也表示今年会生产3nm,然后2023年会大规模出货,也就是说今年这两大厂商肯定会进入3nm。接