Android WebView关闭Activity重开后缓存丢失重复加载资源问题
WebView关闭Activity后缓存失效修复方案
你当前的基础配置逻辑没有明显问题,Activity内跳转缓存正常、重开Activity全量重载资源,本质是缓存没有做全局持久化,按以下优先级排查修复:
- 替换WebView初始化的Context
不要使用Activity级Context创建WebView实例,必须传入applicationContext。部分Android高版本和国内定制ROM中,用Activity Context初始化WebView时,HTTP缓存、DOM存储、Cookie数据会写入Activity私有数据目录,Activity销毁后该目录会被系统纳入可清理范围,重开时自然读不到之前的缓存。 - 手动指定全局WebView数据目录
不要依赖WebView默认的存储路径,在Application类的onCreate中、所有WebView实例创建之前,提前配置全局数据目录,避免数据随Activity生命周期被回收:
初始化WebSettings时补充缺失的缓存配置:// Application onCreate 内执行 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { val dataDir = File(filesDir, "global_webview_data") if (!dataDir.exists()) dataDir.mkdirs() WebView.setDataDirectorySuffix("main_process") }webSettings.setAppCachePath(File(cacheDir, "web_app_cache").absolutePath) webSettings.setAppCacheEnabled(true) webSettings.databaseEnabled = true - 调整缓存模式适配业务场景
LOAD_DEFAULT模式的规则是「缓存未过期则用缓存,过期则拉网络」,如果你的H5静态资源都带版本哈希、更新策略可控,可以替换为LOAD_CACHE_ELSE_NETWORK,该模式下只要本地存在对应缓存,无论是否过期都会优先使用,仅当本地无缓存时才请求网络,缓存命中率远高于默认模式。 - 排查误清理缓存的逻辑
除了你自身代码不要调用clearCache(true)(传入true会清空应用全局所有WebView的缓存文件),还要排查接入的第三方SDK:不少广告、推送、统计SDK会在应用退后台或者Activity销毁时全局调用WebView缓存清理方法,是非常容易遗漏的踩坑点。 - 补充持久化配置
你已经开启了DOM存储,还需要确认Cookie持久化配置正常,避免因为鉴权Cookie丢失导致页面强制拉取全新资源:val cookieManager = CookieManager.getInstance() cookieManager.setAcceptCookie(true) cookieManager.setAcceptThirdPartyCookies(webView, true) cookieManager.flush() // 主动触发Cookie落盘,避免系统调度延迟导致数据没写入存储
验证方式:首次加载完页面后关闭WebActivity,进入应用私有存储目录查看之前配置的
global_webview_data、web_app_cache文件夹大小,如果存在对应资源文件,说明缓存已经正常持久化,重开页面不会重复加载已缓存的静态资源。
内容的提问来源于stack exchange,提问作者Rahul Mishra
相关产品推荐
相关产品推荐

