当前位置: 首页 > news >正文

建站平台石家庄盘古营销qq

建站平台石家庄盘古,营销qq,重庆政府是指什么,弹窗网站制作OkHttp 是一套处理 HTTP 网络请求的依赖库,由 Square 公司设计研发并开源,目前可以在 Java 和 Kotlin 中使用。对于 Android App,OkHttp 现在几乎已经占据了所有的网络请求操作。RetroFit OkHttp 实现网络请求似乎成了一种标配。 因此&…

OkHttp 是一套处理 HTTP 网络请求的依赖库,由 Square 公司设计研发并开源,目前可以在 Java 和 Kotlin 中使用。对于 Android App,OkHttp 现在几乎已经占据了所有的网络请求操作。RetroFit + OkHttp 实现网络请求似乎成了一种标配。

因此,它也是每个 Android 开发工程师的必备技能。了解其内部实现原理,可以更好的进行功能扩展、封装以及优化。因为是 Http 网络请求的依赖库,所有需要有一定的网络知识基础。

网络请求流程分析

OkHttp 经过几次迭代后,发生了很多变化:

\bullet 更好的 WebSocke 支持;

\bullet 更好的 Interceptor 责任链;

\bullet 最核心的 HttpEngine 也变成了 HttpCodec。

OkHttp的基本使用

OkHttpClient client = new OkHttpClient();Request request = new Request.Builder().url(url).build();client.newCall(request).enqueue(new Callback(){@Overridepublic void onFailure(Call call, IOException e){}@Overridepublic void onResponse(Call call, Response response) throw IOException{}
});

除了直接 new OkHttpClient() 之外,还可以使用内部工厂类 Builder 来设置 OkHttpClient。如下所示

OkHttpClient.Builder builder = new OkHttpClient.Builder();
builder.connectTimeout(60, TimeUnit.SECONDS) // 设置超时.addInterceptor(interceptor) // 添加拦截器.proxy(proxy) // 设置请求代理.cache(cache); // 设置缓存策略
OkHttpClient client = builder.build();

请求操作的起点从 OkHttpClient.newCall().enqueue() 方法开始

newCall():这个方法会返回一个 RealCall 类型对象。通过它将网络请求操作添加到网络请求队列中去。

RealCall.enqueue():调用 dispatcher 的入队方法,执行一个网络请求操作。

可以看出,最终的请求操作是委托给 dispatcher 的 enqueue() 方法内实现的。

Dispatcher 是 OkHttpClient 的调度器,是一种门户模式。主要用来实现执行、取消异步请求操作,本质上是内部维护了一个线程池去执行异步操作。并且,在 Dispatcher 内部根据一定的策略,保证最大并发个数、同一 host 主机允许执行请求的线程个数。

Dispatcher 的 enqueue() 方法具体实现,如下

可以看出,实际上就是使用线程池执行了一个 AsyncCall,而 AsyncCall 实现了 Runnable 接口。因此整个操作会在一个子线程中执行。AsyncCall 中的 run() 方法如下

在 run() 方法中执行了另一个 execute() 方法。而真正获取请求结果的方法是在 getResponseWithInterceptorChain() 方法中。其内部是一个拦截器的调用链。具体代码如下

每一个拦截器的作用

\bullet BridgeInterceptor:主要对 Request 中的 Head 设置默认值。比如 Content-Type、Keep-Alive、Cookie 等。

\bullet CacheInterceptor:负责 HTTP 请求的缓存处理。

\bullet ConnectInterceptor:负责建立与服务器地址之间的连接,也就是 TCP 链接。

\bullet CallServerInterceptor:负责向服务器发送请求,并从服务器拿到远端数据结果。

在添加上述几个拦截器之前,会调用 client.interceptors,将开发人员设置的拦截器添加到列表当中。对于 Request Head 以及 TCP 链接,我们能控制修改的成分不说很多,所以我们重点分析的是 CacheInterceptor 和 CallServerInterceptor。

1. CacheInterceptor 缓存拦截器

CacheInterceptor 主要做以下几件事情:

a. 根据 Request 获取当前已有缓存的 Response(有可能为 null),并根据获取到的缓存 Response,创建 CacheStrategy 对象。

b. 通过 CacheStrategy 判断当前缓存中的 Response 是否有效(比如是否过期)。

如果缓存 Response 可用,则直接返回。否则调用 chain.proceed() 继续执行下一个拦截器。也就是发送网络请求,从服务器获取远端 Response,具体如下

c. 如果从服务器端成功获取 Response,再判断是否将此 Response 进行缓存操作。代码如下

通过 Cache 实现缓存功能

通过上面分析缓存拦截器的流程可以看出,OkHttp 只是规范了一套策略,但是具体使用何种方式将数据缓存到本地,以及如何从本地缓存中取出数据,都是由开发人员自己定义并实现,并通过 OkHttpClient.Builder 的 cache 方法设置。

OkHttp 提供了一个默认的缓存类 Cache.java,可以在构建 OkHttpClient 时,直接使用 Cache 来实现缓存功能。只需要指定缓存路径以及最大可用空间即可。如下所示

上述代码使用 Android app 内置目录 cache 目录作为缓存路径,并设置缓存最大可用空间为 20M。

实际上,在 Cache 内部使用了 DiskLruCache 实现具体的缓存功能。如下所示

DiskLruCache 最终会以

2. CallServerInterceptor 拦截器

CallServerInterceptor 是 OkHttp 最后一个拦截器,也是 OkHttp 中最核心的网络请求部分。它的 Intercept 方法如下

如上图所示,主要分为两部分。蓝线以上的操作是向服务器端发送请求数据,蓝线以下代表从服务器端获取请求结果并构建 response 对象

OkHttp 使用扩展

仔细观察上面的代码,在 CallServerInterceptor 中的 Intercept 方法。可用发现,在向服务的发送数据和获取数据都是使用一个 Okio 的框架。

Okio 是 Square 公司打造的另外一个轻量级 IO 库,它是 OkHttp 框架的基石。在构建 Response 时,需要调动 body() 方法传入一个 ResponseBody 对象,ResponseBody 内部封装了对请求结果的流读取操作。可用通过继承并扩展 ResponseBody 的方式获取网络请求的进度。

a. 继承 ResponseBody

其中,progressListener 是一个自定义的进度监听器,通过它向上层汇报网络请求进度。

b. 自定义 progressBarClient

getClient 可以根据项目的不同添加其他共通设置,比如 timeout 时间,DNS、Log日志 interceptor 等。

getProgressBarClient 通过添加一个拦截器,并且在 intercept 方法中将自定义的 ProgressResponseBody 传个 body 方法。当通过 getProgressBarClient 发送网络请求时,OkHttpClient 从服务端获取到数据之后,会不断调用 ProgressResponseBody 中的 source 方法。然后通过 progressListener 向上层通知请求进度的结果。

c. 实践拓展-Picasso

我们可以将上面实现的 ProgressBarClient 用于 Square 公司另一个请求库--Picasso。Picasso 是 Square 公司研发用来从网络端获取图片数据的依赖库,内部实质上是使用 OkHttp 来实现请求操作的。因此我们可以将 ProgressBarClient 替换 OkHttpClient,这样就能获取下载图片的进度。代码如下

 后续只要通过 GetPicasso 方法即可获得一个自带下载进度的 Picasso 对象。因为,OkHttp、Picasso 和 Okio 都来自 Square 公司。

总结

主要分析了 OkHttp 的源码实现:

\bullet OkHttp 内部是一个门户模式,所有的下发工作都是通过一个门户 Dispatcher 来进行分发。

\bullet 在网络请求阶段通过责任链模式,链式的调用各个拦截器的 intercept 方法。重点介绍了2个比较重要的拦截器:CacheInterceptorCallServerInterceptor。它们分别用来做请求缓存执行网络请求操作。

\bullet 在理解源码实现的基础上,对 OkHttp 的功能进行了一些扩展,实现了网络请求进度的实现。

http://www.hkea.cn/news/805334/

相关文章:

  • 爬取漫画数据做网站今日热搜新闻头条
  • 雄安网站建设制作网站关键词如何快速上首页
  • 佛山从事网站建设百度小程序入口官网
  • 自建网站平台可以实现哪些功能网络营销这个专业怎么样
  • 佛山新网站制作公司网页制作成品模板网站
  • 校园网站建设的意见企业管理培训课程网课
  • 郑大远程教育动态网站建设seo优化关键词排名
  • 做logo什么网站昆明百度关键词优化
  • 怎样做省钱购物网站sem推广代运营
  • 英文网站开发公司万网阿里云域名查询
  • 做调查问卷网挣钱的网站新闻 今天
  • 网站建设工作小组在线建站平台免费建网站
  • 可以发广告的网站湖南seo推广系统
  • 大丰网站建设哪家好成都seo
  • 学校网站建设项目的wbsseo交流qq群
  • 筑梦网站建设西安百度竞价开户
  • 个体营业执照可以做网站搞推广吗推广网站制作
  • 公共交通公司网站建设方案移动慧生活app下载
  • 国内开源代码网站搜了网推广效果怎么样
  • html5 metro风格网站模板今日新闻事件
  • 网站不在首页显示出来做网络推广
  • 上海网站seo公司网页推广平台
  • 网站服务器租用价格表百度怎么发布自己的广告
  • 经纪人做网站技巧搜索引擎入口yandex
  • 教育网站制作哪家服务好全球外贸采购网
  • 响应式网络网站源码百度关键词查询网站
  • 南京网站制作设计公司网络运营团队
  • 阿里巴巴上怎样做自己的网站seo网站优化网站编辑招聘
  • 网站做付费推广都需要问什么网络热词2022
  • 给男票做网站表白的软件产品市场推广计划书