如何启用webview的过期头缓存



我正在构建一个由菜单和webview组成的应用程序。当用户选择菜单项时,webview应该加载相应的html文件。到目前为止一切顺利。

现在我正在经历,每次我按下菜单项时,webview都在请求html。我想只加载html一次在一个会话,因为html文件不会在一天内改变。所以我做的第一件事是在服务器端正确设置过期头。你可以在这里查看:

http://redbot.org/?uri=http%3A%2F%2Fcutoutcam.com%2Ftest1.php

Then I try

mWebView.getSettings().setCacheMode(WebSettings.LOAD_DEFAULT);

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

结果:

第一个版本每次都请求HTML(用代理检查)->这很奇怪。它应该显示缓存的版本,只要它没有过期。有什么问题吗?

第二个版本从来没有请求一个新的HTML文件(这很好,因为它应该这样做)

有人知道为什么过期头在这里不能正确工作吗?

整个代码:

mWebView = (WebView) getView().findViewById(R.id.fragment_web_view_wv);
mWebView.setWebViewClient(new WebViewClient(this));
mWebView.setScrollBarStyle(View.SCROLLBARS_OUTSIDE_OVERLAY);

mWebView.setWebChromeClient(new WebChromeClient() {
      @Override
      public void onReachedMaxAppCacheSize(long spaceNeeded, long totalUsedQuota,
              android.webkit.WebStorage.QuotaUpdater quotaUpdater)
      {
            quotaUpdater.updateQuota(spaceNeeded * 2);
      }
});
mWebView.getSettings().setDomStorageEnabled(true);

mWebView.getSettings().setAppCacheMaxSize(1024*1024*8);

String appCachePath = getActivity().getApplicationContext().getCacheDir().getAbsolutePath();
mWebView.getSettings().setAppCachePath(appCachePath);
mWebView.getSettings().setAllowFileAccess(true);
mWebView.getSettings().setAppCacheEnabled(true);
mWebView.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ONLY);
mWebView.getSettings().setDefaultZoom(WebSettings.ZoomDensity.FAR);
mWebView.loadUrl(args.getString("url"));

大多数现代浏览器总是会向服务器发出请求,即使是缓存内容,只是为了检查服务器是否有更新的内容可用。在这种情况下,浏览器将在请求中包含一个"if - modified - since"头,这样如果没有任何更改,服务器可以快速返回一个空的HTTP 304响应。

你的选择是1)配置您的服务器以评估Last-Modified-Since并根据需要返回304。这将告诉浏览器继续使用缓存的内容。2)使用javascript实现页面加载,并使用本地存储创建自定义缓存机制,而不受浏览器供应商的影响。这是一点工作,但我已经成功地完成了几个性能敏感的项目。

使用WebSettings.LOAD_CACHE_ELSE_NETWORK,我认为这是你需要的。

最新更新