网络 - OkHttp

一、概念

二、基本使用

2.1 get请求

fun getCall() {//创建客户端val client = OkHttpClient.Builder().connectTimeout(5000, TimeUnit.MILLISECONDS).build()//创建请求val request = Request.Builder().get().url("https://www.baidu.com").build()//创建任务val call = client.newCall(request)//执行任务call.enqueue(object : Callback {override fun onFailure(call: Call, e: IOException) {Log.d("ErrorMsg", e.toString())}override fun onResponse(call: Call, response: Response) {//结果码==200if (response.code == HttpURLConnection.HTTP_OK) {response.body//(反序列化,json转bean)val dataBean = Gson().fromJson(response.body.toString(), DataBean::class.java)}}})
}

2.2 post请求

fun postCall() {//创建客户端val client = OkHttpClient.Builder().connectTimeout(5000, TimeUnit.MILLISECONDS).build()//创建要提交的内容(序列化,内容转bean再转json)val dataBean = DataBean("张三")val jsonStr = Gson().toJson(dataBean)val mediaType = "application/json".toMediaTypeOrNull()val requestBody = jsonStr.toRequestBody(mediaType)//创建请求val request = Request.Builder().post(requestBody).url("https://www.baidu.com").build()//创建任务val call = client.newCall(request)//执行任务call.enqueue(object : Callback {override fun onFailure(call: Call, e: IOException) {Log.d("ErrorMsg", e.toString())}override fun onResponse(call: Call, response: Response) {Log.d("Result", response.body.toString())}})
}

三、使用缓存

当某些网络访问获取的内容是短时间不变的(每月榜单)或长时间不变的(歌曲的信息),每次访问都联网获取数据的话,会重复浪费用户和公司的流量费用和带宽占用。

服务端侧缓存当客户端重复访问一张图片地址时,服务器会判断这个请求有没有缓存,有的话就直接返回掉这个请求,而不是到达真正的服务器地址,依次减轻运算压力。
客户端侧缓存客户端将服务器返回的数据缓存在本地,再次访问同一地址的时候,客户端会检测本地是否有缓存,如果有且未过期就直接使用缓存内容。
使用 Cache客户端能够同服务端一起协同开发,以服务器设置的消息头缓存策略为准。
使用 Interceptor没法协同开发,自己设置 Cache-Control 来控制缓存策略,Interceptor 可以拿到 Request 和 Response。属于一刀切,经常更新和很久更新的数据无法细分处理。
使用 CacheControl每个 Request 有它自己的缓存时间。

3.1 使用 Cache(自适应服务器配置)

设置好Cache后,同一个地址访问两次打印Log:第一次访问的response.networkResponse( )有内容(来自网络)而response.cacheResponse( ) = null;第二次访问相反,response.cacheResponse( )有内容(来自缓存)而response.networkResponse( ) = null。

private val cache by lazy {//缓存存放路径val cacheFile = File(APP.context.externalCacheDir, "retrofitCache")//缓存大小100Mval cacheSize = (1024 * 1024 * 100).toLong()//创建缓存对象Cache(cacheFile, cacheSize)
}private val okHttpClient by lazy {OkHttpClient.Builder().cache(cache)    //设置缓存.build()
}

3.2 使用 Interceptor(自行配置Response)

private val intercept = object : Interceptor{override fun intercept(chain: Interceptor.Chain): Response {val request = chain.request()val response = chain.proceed(request).apply {newBuilder().removeHeader("pragma").header("Cache-Control","max-age=60").build()}return response}
}private val okHttpClient by lazy {OkHttpClient.Builder().chache(cache).addNetworkInterceptor(intercept)   //添加网络拦截器.build()
}

3.3 使用 CacheControl(自行配置Request)

类中提供了两个已经定义好的,通过伴生对象调用,一般根据有无网络访问来返回不同的对象。也可以根据需求通过 CacheControl.Builder() 自定义。

CacheControl.FORCE_NETWORK只获取网络数据。
CacheControl.FORCE_CACHE只读取本地缓存。
noStore()不使用缓存,也不存储缓存。
onlyIfCached()只使用缓存。
noTransform()禁止转码。
maxAge(10, TimeUnit.MILLISECONDS)超时时间为10ms。
maxStale(10, TimeUnit.SECONDS)超时之外的超时时间为10s。
minFresh(10, TimeUnit.SECONDS)超时时间为当前时间加上10秒钟。
private val intercept = object : Interceptor{override fun intercept(chain: Interceptor.Chain): Response {val request = chain.request().apply {val cacheControl = CacheControl.Builder().maxAge(60,TimeUnit.SECONDS)    //缓存缓存有效期60秒.build()newBuilder()
//              .cacheControl(CacheControl.FORCE_CACHE)    //使用定义好的.cacheControl(cacheControl)    //使用自定义的.build()}val response = chain.proceed(request)return response}
}private val okHttpClient by lazy {OkHttpClient.Builder().chache(cache).addNetworkInterceptor(intercept)   //添加网络拦截器
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/700029.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python程序设计基础:字符串与正则表达式

第四章:字符串与正则表达式 4.1字符串 最早的字符串编码是美国标准信息交换码ASCII,仅对10个数字、26个大写英文字母、26个小写英文字母及一些其他符号进行了编码。ASCII码采用1个字节来对字符进行编码,最多只能表示256个符号。 随着信息技…

【数据结构与算法初学者指南】【冲击蓝桥篇】String与StringBuilder的区别和用法

🎉🎉欢迎光临🎉🎉 🏅我是苏泽,一位对技术充满热情的探索者和分享者。🚀🚀 🌟特别推荐给大家我的最新专栏《数据结构与算法:初学者入门指南》📘&am…

docker打包当前dinky项目

以下是我的打包过程&#xff0c;大家可以借鉴。我也是第一次慢慢摸索&#xff0c;打包一个公共项目&#xff0c;自己上传。 如果嫌麻烦&#xff0c;可以直接使用我的镜像&#xff0c;直接跳到拉取镜像&#xff01; <可以在任何地方的服务器进行拉取> docker打包当前din…

LLMs之Gemma:Gemma(Google开发的新一代领先的开源模型)的简介、安装、使用方法之详细攻略

LLMs之Gemma&#xff1a;Gemma(Google开发的新一代领先的开源模型)的简介、安装、使用方法之详细攻略 导读&#xff1a;此文章介绍了Google推出的新一代开源模型Gemma&#xff0c;旨在帮助研发人员负责任地开发AI。 背景&#xff1a; >> Google长期致力于为开发者和研究人…

如何在 非C盘 安装 WSL?

来源&#xff1a;https://superuser.com/questions/1572834/is-there-any-way-to-install-wsl-on-non-c-drive 首先打开 Powershell&#xff0c;输入如下命令 &#xff08;Set-Location 到你想放置 WSL2 的磁盘&#xff09; # Substitute the drive on which you # want WSL …

linux下搭建boost、muduo、mysql、nginx

参考博客&#xff1a; 1.boost&#xff1a;C网络编程 - Boost::asio异步网络编程 - 01- boost库源码编译安装 2.muduo&#xff1a;C muduo网络库知识分享01 - Linux平台下muduo网络库源码编译安装 3.mysql&#xff1a; sudo apt-get install mysql-server sudo apt-get inst…

Vue(学习笔记)

什么是Vue Vue是一套构建用户界面的渐进式框架 构建用户界面&#xff1a; 基于数据渲染出用户可以看到的界面 渐进式&#xff1a; 所谓渐进式就是循序渐进&#xff0c;不一定非得把Vue中的所有API都学完才能开发Vue&#xff0c;可以学一点开发一点 创建Vue实例 比如就上面…

猫头虎分享已解决Bug || ImportError: Keras requires TensorFlow 2.2 or higher

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

C++函数对象-运算符函数对象 - 旧式绑定器与适配器 - 从成员函数指针创建包装器,能以一个对象引用调用 (std::mem_fun_ref)

任何定义了函数调用操作符的对象都是函数对象。C 支持创建、操作新的函数对象&#xff0c;同时也提供了许多内置的函数对象。 旧式绑定器与适配器 早期提供功能支持的几个工具在 C11 中弃用&#xff0c;并于 C17 中移除&#xff08;旧否定器于 C17 中弃用并于 C20 中移除&#…

Devc++ 开发的 Easyx 瓦片地图编辑器之自定义贴图导入模块

接上次开发 Editing While Playing 使用 Easyx 开发的 RPG 地图编辑器 tilemap eaitor-CSDN博客 由于还不能导入自己绘制的贴图&#xff0c;所以还要增加自定义贴图的导入导出模块 这里就单独搓了一个自定义导入导出部分&#xff0c;之后再缝合进瓦片地图编辑器里 #include &…

openai sora 只能根据文本生成视频?不,TA 是通用物理世界模拟器

视频生成模型作为世界模拟器 我们探索了在视频数据上进行大规模生成模型的训练。 具体来说&#xff0c;我们联合在可变持续时间、分辨率和长宽比的视频和图像上训练文本条件扩散模型。 我们利用了一个在视频和图像潜在编码的时空补丁上操作的变压器架构。 我们最大的模型So…

C++的string容器->基本概念、构造函数、赋值操作、字符串拼接、查找和替换、字符串比较、字符存取、插入和删除、子串

#include<iostream> using namespace std; #include <string> //string的构造函数 /* -string(); //创建一个空的字符串 例如: string str; -string(const char* s); //使用字符串s初始化 -string(const string& str); //使…

Leetcode 209.长度最小的子数组

给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其总和大于等于 target 的长度最小的 连续子数组 [numsl, numsl1, ..., numsr-1, numsr] &#xff0c;并返回其长度。如果不存在符合条件的子数组&#xff0c;返回 0 。 示例 1&#xff1a; 输入&…

MYSQL--触发器

一:介绍: 1.触发器实际上就是一种特殊的存储过程,两者都能够在MYSQL当中完成特定的功能,存储在服务器上的特殊SQL片段,可以重复进行使用,提高复用性的一种功能.但是触发器并不需要进行调用,在使用DML操作的时候会自动的调用相关的触发器操作 2.触发器能够对于DML操作当中的,删除…

Linux基础命令-文件管理

目录结构 1.存放命令相关的目录 /bin #普通用户使用的命令 /bin/ls, /bin/date /sbin #管理员使用的命令 /sbin/service2.存放用户相关数据的家目录 /home #普通用户的家目录, 默认为/home/username /root #超级管理员root的家目录, 普通用户无权操作3.系统文件目录 /usr #相当…

《TCP/IP详解 卷一》第3章 链路层

目录 3.1 引言 3.2 以太网 3.3 全双工 省点 自动协商 流量控制 3.4 网桥和交换机 3.5 WiFi 3.6 PPP协议 3.6.1 PPP协议流程 3.7 环回 3.8 MTU和路径MTU 3.9 隧道基础 3.9.1 GRE 3.9.2 PPTP 3.9.3 L2TP 3.10 与链路层相关的攻击 3.11 总结 3.1 引言 城域网&…

132 Linux 系统编程9 ,IO操作,lseek 函数,truncate函数,查看文件的表示形式

一 lseek 函数 函数说明&#xff1a;此函数用于文件偏移 Linux中可使用系统函数lseek来修改文件偏移量(读写位置) 每个打开的文件都记录着当前读写位置&#xff0c;打开文件时读写位置是0&#xff0c;表示文件开头&#xff0c;通常读写多少个字节就会将读写位置往后移多少个字…

Spring Boot到底是如何进行自动配置的?

Spring Boot的自动配置主要通过以下几个步骤实现&#xff1a; 在SpringBoot启动的时候&#xff0c;加载主配置类&#xff0c;这个配置类通常带有SpringBootApplication注解。SpringBootApplication是一个复合注解&#xff0c;它包括了Configuration&#xff0c;EnableAutoConf…

ai数字仿真辩论主持人提升用户体验

Ai虚拟主持人是元宇宙和AI人工智能技术在播音主持行业的重要应用&#xff0c;AI虚拟主持人能极大提升新闻资讯内容的精准度&#xff0c;改变单一的播报形式。 首先&#xff0c;AI虚拟主持人极大地提升了节目的制作效率和灵活性。传统主持人需要花费大量时间进行彩排和录制&…

Jmeter之内置函数__property和__P的区别

1. __property函数 作用 读取 Jmeter 属性 语法格式 ${__property(key,var,default)} 参数讲解 小栗子 ${__property(key)} 读取 key 属性如果找不到 key 属性&#xff0c;则返回 key&#xff08;属性名&#xff09; ${__property(key,,default)} 读取 key 属性如果找不到 k…