当未连接到服务器时,在Android webview中从应用缓存加载

Loading from app cache in Android webview when not connected to server

本文关键字:webview 应用 加载 缓存 Android 连接 服务器      更新时间:2023-09-26

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

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

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

缓存
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);

然后它表现出我期望应用程序缓存的行为。也就是说,如果资源不能通过网络加载,它会从缓存中加载,正如缓存清单中的cache部分所指定的那样。