如何为webview启用expires-header缓存

时间:2013-04-18 12:48:24

标签: android caching http-headers

我正在构建一个包含菜单和webview的应用程序。当用户选择菜单项时,webview应加载尊重的html文件。到目前为止一切都很好。

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

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

然后我试了

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"));

2 个答案:

答案 0 :(得分:2)

大多数现代浏览器将始终向服务器发出请求,即使对于缓存内容,也只是检查服务器是否有更新的可用内容。在这些情况下,浏览器将在请求中包含“If-Modified-Since”标头,以便服务器可以在没有任何更改的情况下快速返回空的HTTP 304响应。

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

答案 1 :(得分:-1)

使用WebSettings.LOAD_CACHE_ELSE_NETWORK我认为这就是您所需要的。