[置顶] NoHttp架构之请求流程解析

NoHttp架构之请求流程解析

技术交流1群:46523908
技术交流2群:46505645
NoHttp 源码及Demo托管在Github欢迎大家Star:https://github.com/Y0LANDA/NoHttp

周六和周日的晚上NoHttp作者在做框架设计直播,大家可以加上面的QQ群来看直播,和作者实时互动。

看官们可以在我主页看其它NoHttp、Volley、OkHttp、xUtil的相关介绍和比较

在正式开始前推荐一篇Volley和NoHttp的比较

  这几天 很多人找我要NoHttp架构流程图,几天给大家写出来,有什么不清楚的在地下留言喔,或者在群里直接at我问也可以喔。
  不过还是建议大家在周六周日晚上来看我的直播,直播连接在上面的QQ群里有,大家可以加一下,会讲蛮多Android干货和框架设计的。

异步请求流程图

Created with Raphaël 2.1.0 NoHttp异步请求架构流程图
Created with Raphaël 2.1.0 UIThread UIThread Queue子线程 Queue子线程 Parser Parser Executor Executor Connection Connection Server Server 添加请求到队列 分发给解析器 调用执行器 添加缓存 调用连接池请求服务器 添加Cookie 请求服务器 服务器响应 处理Cookie 返回服务器响应 处理缓存 处理重定向 返回数据到解析器 解析泛型 返回泛型给Queue 异步发送结果到主线程

异步请求流程描述

  由UI线程发送请求到队列,队列中是子线程在持续运行,当子线程发现请求进入队列时,马上从队列拿出这个请求,交给解析器(Parser)解析请求,解析器(Parser)拿到请求后要先把请求转换成数据再去解析成泛型,所以解析器(Parser)把请求交给执行器(Executor),执行器(Executor)拿到请求后分析缓存是否过期,若缓存没有过期直接返回数据给解析器;如果缓存过期,执行器(Executor)添加缓存头到请求,调用连接器(Connection)请求服务器,连接器(Connection)在和服务端亲热前会添加之前服务器返回的Cookie(带上暗号),连接器(Connection)和服务端亲热完后会处理Cookie(更新/保存暗号),解析完Cookie后把封装好的数据交给执行器(Executor),由执行器(Executor)处理缓存并发结果发送给解析器(Parser),解析器(Parser)拿到数据后解析成泛型返回给调用解析器(Parser)的子线程,由子线程发送异步结果到UI线程,完成请求。

同步请求流程图

Created with Raphaël 2.1.0 NoHttp同步请求架构流程图
Created with Raphaël 2.1.0 Thread Thread Parser Parser Executor Executor Connection Connection Server Server 调用解析器 调用执行器 添加缓存 调用连接池请求服务器 添加Cookie 请求服务器 服务器响应 处理Cookie 返回服务器响应 处理缓存 处理重定向 返回数据到解析器 解析泛型 返回泛型给调用Thread

同步请求流程描述

  Thread调用解析器(Parser)解析请求,解析器(Parser)拿到请求后要先把请求转换成数据再去解析成泛型,所以解析器(Parser)把请求交给执行器(Executor),执行器(Executor)拿到请求后分析缓存是否过期,若缓存没有过期直接返回数据给解析器;如果缓存过期,执行器(Executor)添加缓存头到请求,调用连接器(Connection)请求服务器,连接器(Connection)在和服务端亲热前会添加之前服务器返回的Cookie(带上暗号),连接器(Connection)和服务端亲热完后会处理Cookie(更新/保存暗号),解析完Cookie后把封装好的数据交给执行器(Executor),由执行器(Executor)处理缓存并发结果发送给解析器(Parser),解析器(Parser)拿到数据后解析成泛型返回给Thread。

Executor执行器流程图

Created with Raphaël 2.1.0 NoHttp执行器(Executor)流程图
Created with Raphaël 2.1.0 Entrance Entrance Cache Cache IsOnlyCache IsOnlyCache CacheIsExpires CacheIsExpires Server Server 读取缓存 是否仅读取缓存 是,仅读取缓存,直接返回 缓存是否过期 未过期,返回缓存数据 已过期,需要服务器验证 响应码304(未过期),更新缓存的响应头 返回缓存数据 响应码200(已过期),替换原来的缓存、原来的响应头 返回响应数据 缓存为null,直接请求服务器 处理缓存 返回相应数据

解析器和连接器原理

  解析器(Parser)原理是,从执行器(Executor)拿到ByteArray和Headers后交给Request的parseResponse方法解析泛型结果。
  连接器负责发送数据、传文件,是NoHttp中最重要的一个模块,后边会专门开一篇博客来讲。

执行器流程描述

  当请求进入执行器时,执行器首先读取这个请求的缓存,第一步接着请求是否要求仅仅读取缓存,如果是,当缓存不为null那么返回succeed,如果缓存为null,返回failed,原因是CacheNotFoundError。第二步当不是仅仅读取缓存时,第二步第一种情况缓存不为null时,如果缓存没有过期,直接返回缓存数据,缓存为null时带上缓存去服务器验证缓存是否过期,此时服务器返回304表示刚才验证的缓存没有过期,直接返回刚才的缓存数据,如果返回200表示缓存过期,返回新的数据;第二步第二种情况,当缓存为null时,直接请求服务器,接受到响应后处理缓存,并返回响应数据。

异步下载流程图

Created with Raphaël 2.1.0 NoHttp异步下载流程图
Created with Raphaël 2.1.0 UIThread UIThread Queue子线程 Queue子线程 Downloader Downloader Server Server Listener Listener Poster Poster 添加请求到队列 分发给Downloader 添加Cookie 处理Cookie 和服务器交互 执行下载任务 调用监听器发送结果 监听器发通知给信使 信使异步发送结果到主线程

异步下载流程描述

  由UI线程发送请求到队列,队列中是子线程在持续运行,当子线程发现请求进入队列时,马上从队列拿出这个请求,调用下载器(Donwloader)请求服务器,下载器(Donwloader)在和服务端亲热前会添加之前服务器返回的Cookie(带上暗号),下载器(Donwloader)和服务端亲热完后会处理Cookie(更新/保存暗号),解析完Cookie开始下载文件,在下载的过程中调用监听器(Listener)回调状态,监听器(Listener)监听器监听到下载状态发生变化时调用信使(Poster),由信使(Poster)发送异步结果到UI线程,直到请求完成。

同步下载流程图

Created with Raphaël 2.1.0 NoHttp同步下载架构流程图
Created with Raphaël 2.1.0 Thread Thread Downloader Downloader Server Server Listener Listener 调用Downloader 添加Cookie 处理Cookie 和服务器交互 执行下载任务 调用监听器发送结果 Thread直接接受到下载状态

异步下载流程描述

  Thread调用下载器(Donwloader)请求服务器,下载器(Donwloader)在和服务端亲热前会添加之前服务器返回的Cookie(带上暗号),下载器(Donwloader)和服务端亲热完后会处理Cookie(更新/保存暗号),解析完Cookie开始下载文件,在下载的过程中调用监听器(Listener)回调状态,Thread直接拿到下载状态。

NoHttp 源码及Demo托管在Github欢迎大家Star:https://github.com/Y0LANDA/NoHttp

你可能感兴趣的:(android,架构,队列,android下载,NoHttp)