如何刷新webview的缓存?

时间:2012-10-28 14:14:22

标签: java android caching webview android-webview

我正在构建一个本机应用程序,其中(至少)一个部分是一个Web应用程序,伪装成本机应用程序。 Facebook向我们展示了使用良好缓存的重要性,我正在缓存网页,因此当您第二次加载它时感觉就像是应用程序的原生部分。但是,按照我设置的方式,缓存的内容是永久性的。因此,如果我在服务器上更改某些内容,旧的缓存内容仍会显示。

以下是我希望按照优先顺序实现的目标,1是最优选的。

  1. 首先显示缓存的内容。在后台,页面会检查更新的版本,但仅在内容不同时才重新加载。
  2. 或首先显示缓存的内容。在后台页面刷新并重新加载。
  3. OR缓存的内容在X时间(一周?)后被删除,迫使页面重新加载。
  4. 最后一个选项是最不可取的,因为每次页面重新加载时,它都会感觉缓慢而且可怕。第二个选项是我的本机活动的行为方式(首先显示缓存,在后台刷新。但是,如果用户在此期间向下滚动,则会将用户跳到列表的顶部。)。首先是绝对完美的!

    这是我目前正在使用的代码。

    WebView wv = (WebView) v.findViewById(ref_id);
    wv.getSettings().setJavaScriptEnabled(true);
    wv.getSettings().setDatabaseEnabled(true);
    String appDBPath = v.getContext().getApplicationContext().getDatabasePath("AppConstructor").getAbsolutePath();
    
        wv.setWebChromeClient(new WebChromeClient() {
            @Override
            public void onReachedMaxAppCacheSize(long spaceNeeded,
                    long totalUsedQuota, WebStorage.QuotaUpdater quotaUpdater) {
                quotaUpdater.updateQuota(spaceNeeded * 2);
            }
    
            @Override
            public void onExceededDatabaseQuota(String url,
                    String databaseIdentifier, long currentQuota,
                    long estimatedSize, long totalUsedQuota,
                    WebStorage.QuotaUpdater quotaUpdater) {
                quotaUpdater.updateQuota(estimatedSize * 2);
            }
        });
    
    wv.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
    wv.getSettings().setDomStorageEnabled(true);
    wv.getSettings().setAppCacheMaxSize(1024 * 1024 * 8);
    String appCachePath = v.getContext().getApplicationContext().getCacheDir().getAbsolutePath();
    wv.getSettings().setAppCachePath(appCachePath);
    wv.getSettings().setAllowFileAccess(true);
    wv.getSettings().setAppCacheEnabled(true);
    wv.loadUrl(ref_arg1);
    Core x = new Core();
    wv.addJavascriptInterface(x.new JavaScriptInterface(v.getContext()),"Android");
    

    非常感谢任何帮助!

1 个答案:

答案 0 :(得分:4)

好的,在搜索了年龄,甚至在StackOverflow上获得了风滚草的成就之后,这就是我如何设法获得情况1。

WebView加载了它的缓存后,它会启动一个新的ASyncTask。这个ASyncTask将一些内容附加到URL,这是我自己的自定义最后更新变量。当然,您可以用HTTP Header Last-Update替换它,但这对我不起作用。如果结果变量与缓存变量(我存储在SharedPreferences中)不同,则ASyncTask会使用以下代码强制刷新WebView的缓存。

_wv.getSettings().setCacheMode(WebSettings.LOAD_DEFAULT);
_wv.reload();