Android WebView 响应缓存 笔记

Android WebView 响应缓存

在 Android开发中,经常用到 WebView 进行 Hybrid 模式开发,而 缓存是 常见的优化方式。

一、WebView 缓存模式

Android WebView 通过 WebSettings.setCacheMode 设置缓存方式。
有 5 种模式,实际现在 4 种:

缓存方式说明
LOAD_DEFAULT默认处理方式,缺省 启发式缓存
LOAD_NO_CACHE不走缓存,直接从网络获取
LOAD_CACHE_ONLY不使用网络,仅从缓存加载
LOAD_CACHE_ELSE_NETWORK先取缓存(即使已过期),不存在则再网络获取
LOAD_NORMAL同LOAD_DEFAULT,api17 已摒弃

二、HTTP缓存

2.1 服务端,响应缓存控制

1. Cache-Control,max-age指定 缓存有效期(单位秒)

// 缓存有效期 1 小时
Cache-Control: max-age=3600

2. Expires,指定 具体过期时间

Expires: Tue, 28 Feb 2022 22:22:22 GMT

注:当 ExpiresCache-Control 同时存在时,优先使用 Cache-ControlExpires 存在 时间格式复杂 和 系统时钟修改导致问题,推荐使用 Cache-Control

2.2 缓存状态

HTTP响应缓存状态:freshstale

以响应 Cache-Control: max-age=3600 为例:

  • 1小时内 再请求,状态为 fresh,取缓存;
  • 超出一小时 再请求,状态为 stale,进行 网络请求。

当状态为 stale 时,网络请求 重新获取。但可能存在 验证缓存 逻辑,网络返回 304 状态码,继续使用缓存。

2.3 验证缓存

常见的2种方式:

  1. 服务端响应 Last-Modified + 浏览器请求 If-Modified-Since
  2. 服务端响应 ETag + 浏览器请求 If-None-Match

注:

第1种方式,时间 格式复杂会难解析 和 分布式环境时间不统一,代替的方案是 优先使用 ETag

2.4 重新加载

1. 重新加载(reload)

不判断 响应缓存状态,直接 验证流程。
和 Chrome 浏览器 Ctrl+R 刷新 效果相同。

请求时,使用下面 Headers:

Cache-Control: max-age=0;
If-None-Match: xxx;
If-Modified-Since: xxx;

max-age=0 表示 不使用存储的响应,发送 验证 请求。

  • 当资源未过期,服务端返回 304 Not Modified,则浏览器 取缓存;
  • 资源过期,服务端 返回 200,直接返回 响应数据。

Android手动设置重新加载:

  1. loadUrl(url, additionalHttpHeaders) 方法,添加
    Cache-Control: max-age=0 header 来设置 缺省 缓存策略,实现加载最新。

  2. WebView.reload() 方法调用,则会 自动添加 max-age=0 控制重新加载。

注:Android WebView 请求时,默认可能会覆盖 UA、缓存、接收类型等Headers。

2. 强制重新加载(force reload)

不使用缓存,也不验证,重新从服务器获取资源。
和 Chrome 的 Ctrl+Shift+R 的效果相同,DevTools可看。

请求时,使用下面 Headers:

Pragma: no-cache;
Cache-Control: no-cache;

使用上述 headers ,非条件请求,可以确保 从服务端响应 200,而不是 验证 请求,是 真正的不使用缓存

对应 Android WebView 的 CacheMode:
WebSettings.LOAD_NO_CACHE 时,对应 强制重新加载。

三、WebView 缓存清理

1. WebView.clearCache(true) 清空资源缓存

补充 Web存储 清理:

2. WebStorage.getInstace().deleteAllData() 清空 Web Storage 存储;
3. CookieManagerremoveAllCookies()flush() 管理 Cookies

文档

  • HTTP 缓存 | Mozilla
  • 启发式缓存
  • Cache-Control | Mozilla
  • WebView | Android
  • WebSettings setCacheMode | Android
  • webview 发布代码页面缓存不更新
  • 说说HTTP缓存Cache-Control响应头
  • HTTP协议头中Cache-Control、no-cache和max-age=0的区别

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

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

相关文章

教你用JMeter做接口测试的几个简单实例

前言 这次小项目是基于HTTP协议的接口,通过JMeter来完成一次基本的接口测试,完整复习一下JMeter的基本操作。 在实际项目中,测试也要先从开发那拿到接口说明书,分析熟悉业务后,写接口的测试用例,最后再在…

Java毕业设计—vue+SpringBoot调查问卷管理系统

研究目的 在进入21世纪以后,互联网得到了蓬勃的发展,电子问卷调查也开始逐渐流行起来。传统纸质问卷和电子问卷相比较后,传统问卷还存在很多弊端: 问卷分发起来比较困难,并且分发试卷耗费大量的金钱和时间&#xff1…

2024年金科《数字媒体技术》专业参考书目及考试大纲

《计算机网络基础》考试大纲 一、参考书目: 《计算机网络技术与应用(第 2 版)》,段标、张玲主编,电子工业出版社. 二、考试形式: 闭卷,考试时间 90 分钟 三、考试内容和要求 (一…

Visual Studio(VS)常用快捷键(最详细)

Visual Studio常用快捷键 一、生成:常用快捷键二、调式:常用快捷键三、编辑:常用快捷键四、文件:常用快捷键五、项目:常用快捷键六、重构:常用快捷键七、工具:常用快捷键八、视图:常…

Echarts多图表动态更新示例

前端框架(html、echarts、jquery) <!DOCTYPE html> <html><head><meta charset"utf-8"><title>echarts多图表动态更新示例</title><script src"jquery.min.js"></script><script type"text/java…

强大的TFTP工具:Transfer免激活最新版

Transfer for Mac功能介绍 从头开始编写的Transfer可以完全控制您的文件传输&#xff0c;同时可以与现有的TFTP客户端完美兼容。Transfer附带对常见TFTP协议扩展和选项的支持&#xff0c;包括&#xff1a; RFC 2347-TFTP选项扩展 RFC 2348-TFTP块大小选项 RFC 2349-TFTP超时…

SystemUI下拉通知菜单栏定时自动隐藏

前言 在系统应用开发过程中&#xff0c;常常遇到一些特殊的需求&#xff0c;Android原生的应用并无此适配&#xff0c;此时需要对系统应用进行定制化开发。 目前遇到的这样一个需求&#xff1a;下拉通知菜单栏时&#xff0c;定时8秒后自动关闭通知菜单栏。通知菜单栏为Sytstem…

Python面经【11】- Python可迭代对象一网打尽专题

Python面经【11】- Python可迭代对象一网打尽专题 可迭代对象Python的迭代器、生成器1) 迭代器2) 生成器 可迭代对象、迭代器的区别12. 生成器、迭代器的区别什么是装饰器&#xff1f;函数装饰器有什么作用一句话解释什么样的语言能够使用装饰器Python中的作用域&#xff1f;什…

自卑与自信,自爱的人最幸福

自信与自卑的区别&#xff0c;重要的一点是评价机制的差异 自信的人对自己有一个整体的评价&#xff0c;他们运用内在的评价机制&#xff0c;他们习惯从自己身上找原因&#xff0c;尊重自己内在的感觉&#xff0c;按照自己的直觉行事。也就是说&#xff0c;不管别人如何评价&am…

Linux CentOS7 Docker安装Jenkins

1 sudo yum update #确保yum包更新到最新 service network restart #重启网络 2、查询镜像 docker search jenkins 3、拉取镜像 docker pull jenkins/jenkins #拉取镜像 4、创建Jenkins工作目录&#xff0c;并将容器内目录挂载到此目录…

远程服务器——如何在Conda中安装R环境

目录 1. R的安装2. VScode 配置参考文献 1. R的安装 推荐使用anaconda或者miniconda&#xff0c;创建虚拟环R_env境然后安装R&#xff1b; 使用conda search r-base查看可下载的R的版本&#xff1b;R版本比较低&#xff0c;一般可以先增加源&#xff1a; % 增加源 conda con…

垂直领域大模型算法团队招聘AIGC算法工程师(社招/实习)

base 北京 根据实习表现有转正名额&#xff0c;目前实习HC比较宽松&#xff0c;社招有HC但审批不太容易。 联系方式&#xff1a;leayc 艾特 hotmail.com 请标题注明【CSDN求职】并附简历 【职责】 负责领域大模型的继续预训练&#xff08;pre-training&#xff09;、微调对齐…

计算机视觉技术在智慧城市建设中的应用

计算机视觉技术在智慧城市建设中的应用 随着城市化进程的不断推进&#xff0c;更多的人们选择在城市生活、工作和娱乐。面对快速增长的人口和日益复杂的城市环境&#xff0c;很多城市开始探索智慧城市的建设。智慧城市的核心就是将现代信息技术应用于城市管理中&#xff0c;以…

阿里云语音转文本

import requests from http import HTTPStatus import dashscope from dashscope.audio.asr import Recognitiondashscope.api_key你的keyrecognition Recognition(modelparaformer-realtime-v1,formatwav,sample_rate16000,callbackNone) result recognition.call(output.wa…

基于YOLOv8深度学习的西红柿成熟度检测系统【python源码+Pyqt5界面+数据集+训练代码】目标检测、深度学习实战

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

07用户行为日志数据采集

用户行为数据由Flume从Kafka直接同步到HDFS&#xff0c;由于离线数仓采用Hive的分区表按天统计&#xff0c;所以目标路径要包含一层日期。具体数据流向如下图所示。 按照规划&#xff0c;该Flume需将Kafka中topic_log的数据发往HDFS。并且对每天产生的用户行为日志进行区分&am…

Python高级算法——遗传算法(Genetic Algorithm)

Python中的遗传算法&#xff08;Genetic Algorithm&#xff09;&#xff1a;高级算法解析 遗传算法是一种启发式搜索算法&#xff0c;模拟自然选择和遗传机制&#xff0c;用于在解空间中寻找优化问题的解。它通过模拟基因的变异、交叉和选择操作&#xff0c;逐代演化产生新的解…

【Android】DeepLink

官方文档&#xff1a;创建指向应用内容的深层链接 Intro to Deep Linking on Android What is Deep linking? Deeplinks are a concept that help users navigate between the web and applications. They are basically URLs which navigate users directly to the specif…

数据集汇总

1、农业、生物、数据竞赛、教育、金融、健康汇总&#xff1a;https://github.com/awesomedata/awesome-public-datasets 2、人脸识别数据集&#xff1a;http://www.face-rec.org/databases/ 3、Yahoo实验室公开1亿Flickr图像和视频&#xff1a; http://yahoolabs.tumblr.com/po…

linux vfs 路径解析代码注释

linux版本为 v6.7 以chroot修改根目录为例&#xff0c;走一遍流程&#xff0c;重点在path_lookupat的实现。代码按逻辑组织&#xff0c;非真实代码顺序。由于涉及太多细节&#xff0c;每部分的开始会先做一个小结。 chroot 解析路径字符串&#xff0c;逐层进入&#xff0c;检…