9

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

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

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 文件(没关系,因为它应该那样)

任何人都知道为什么 expires 标头在这里不能正常工作?

整个代码:

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

2 回答 2

2

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

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

于 2013-04-28T03:09:08.553 回答
-1

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

于 2013-04-26T11:21:03.783 回答