javascript - 未连接到服务器时从 Android webview 中的应用程序缓存加载

标签 javascript java android webview html5-appcache

我有一个使用 webview 的 Android 应用程序。有一个 java 后端服务器,它提供所有前端文件并通过 apache tomcat 构建缓存 list 。

我的问题是,当服务器未连接但设备已连接到互联网时,我不确定如何从应用程序缓存加载 webview。

如果我进入应用程序代码,我可以强制它使用缓存

webView.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ONLY);

所以我知道我的文件已被适本地缓存。我还尝试了其他堆栈溢出问题的解决方案,这些问题让我检查网络状态并根据网络状态设置缓存模式,如下所示:

     cm = (ConnectivityManager) this.getSystemService(Activity.CONNECTIVITY_SERVICE);
     if(cm.getActiveNetworkInfo().isConnected()) ....

但是,在设备在线但我的服务器已关闭的情况下,这不起作用。在这种情况下,它仍然表示网络正常,并且不会从缓存加载。

理想的解决方案是,当前端 webview 尝试通过网络访问资源并且该资源不可用时,它只是从缓存中加载,这正是它在普通浏览器中的工作方式。但我可以接受解决方法,例如让应用程序检测到我的特定服务器的网络连接并相应地更改缓存模式。

有人知道解决这个问题的最佳方法吗?谢谢。

最佳答案

所以问题似乎是 Android 根本不使用 HTML5 应用程序缓存,除非你告诉它,这真的让我失去了想法。我使用以下代码解决了这个问题:

final WebSettings webviewSettings = webView.getSettings();
final String appCachePath = this.getCacheDir().getAbsolutePath();
webviewSettings.setDomStorageEnabled(true);
webviewSettings.setAppCachePath(appCachePath);
webviewSettings.setAllowFileAccess(true);
webviewSettings.setAppCacheEnabled(true);
webviewSettings.setCacheMode(WebSettings.LOAD_DEFAULT);

然后它的行为就像我期望的应用程序缓存的行为一样。即,如果无法通过网络加载资源(如缓存 list 中的 CACHE 部分所指定),它将从缓存加载资源。

关于javascript - 未连接到服务器时从 Android webview 中的应用程序缓存加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40642448/

相关文章:

javascript - 如何将数据库中的动态菜单项放入 Master Layout.cshtml 中?

javascript - puppeteer page.evaluate 路径与测试 ID

java - 在这里使用@lombok.Cleanup的正确方法是什么?

java - Selenium 中的页面对象模型最佳实践

android - 创建签名包后执行任务

javascript - 如何在没有网络服务器的情况下获取外部 JavaScript 的文本(即 AJAX)

javascript - 模态 Bootstrap - 键盘 ipad 在模态背景下添加空白

java - Java 中泛型类型的子类

android - 如果 Android 用户在设置中禁用了我的应用程序的推送通知,我的应用程序是否仍会静默接收它们?

android - 如何更改 Android Material 主题提醒中的强调色?