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

Posted

技术标签:

【中文标题】未连接到服务器时从 Android webview 中的应用程序缓存加载【英文标题】:Loading from app cache in Android webview when not connected to server 【发布时间】:2017-03-31 06:14:53 【问题描述】:

我有一个使用 webview 的 android 应用。有一个 java 后端服务器提供所有前端文件并通过 apache tomcat 构建缓存清单。

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

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

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

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

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

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

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

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

【问题讨论】:

【参考方案1】:

所以问题似乎是,除非你告诉它,否则 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);

然后它表现出我期望应用缓存的表现。即,如果无法通过网络加载资源,它会从缓存中加载资源,如缓存清单中的 CACHE 部分所指定。

【讨论】:

感谢分享解决方案。

以上是关于未连接到服务器时从 Android webview 中的应用程序缓存加载的主要内容,如果未能解决你的问题,请参考以下文章

使用 proguard 后,Android apk 未连接到 Azure 服务器

IBM Worklight 6.0 - Android 应用程序在 7 月安全更新后未连接到服务器

React-Native 物理设备未连接到服务器

Android模拟器未连接到localhost api

Flutter:未连接到 Android Studio 中的 IOS 模拟器

Flutter 应用程序:IOS 模拟器未连接到 Android Studio