【问题标题】:WebView cache doesn't workWebView 缓存不起作用
【发布时间】:2015-05-27 14:45:13
【问题描述】:

我正在尝试为我的应用中的一项活动中加载的 webView 实现缓存。但是当我关闭当前的 wifi 网络时,我无法加载我的 webview。

我的网络视图:

        progDialog = ProgressDialog.show(activity, "Loading", "Please wait...", true);
        progDialog.setCancelable(false);

        webView = (WebView) findViewById(R.id.my_web_view);
        webView.getSettings().setJavaScriptEnabled(true);
        webView.getSettings().setAppCacheEnabled(true);
        webView.getSettings().setAppCachePath(getApplicationContext().getCacheDir().getAbsolutePath());
        webView.setWebViewClient(new WebViewClient() {
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                progDialog.show();

                if(isNetworkAvailable()){
                    view.getSettings().setCacheMode(WebSettings.LOAD_DEFAULT);
                    view.loadUrl(url);
                }
                else{
                    view.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ONLY/*LOAD_CACHE_ELSE_NETWORK*/);
                    view.loadUrl(url);
                }

                return true;
            }

            @Override
            public void onPageFinished(WebView view, final String url) {
                progDialog.dismiss();
            }
        });
        webView.loadUrl("http://www.google.com/");

我尝试使用这种方法能够知道我的 webView 内容是否保存在缓存中(不确定是否非常正确,只是一个测试):

private void isCacheFileCreated(){
        String uri = "http://www.google.com/";
        String hashCode = String.format("%08x", uri.hashCode());
        File cacheFile = new File(new File(getCacheDir(), "webviewCache"), hashCode);

        if (cacheFile.exists()){
            // cache ok
        } else {
            // no cache
        }
    }

但是当我的网络关闭时,file.exist() 总是错误的。

我的基本流程是:启动我的应用程序 > 使用 webView 转到我的活动并显示 url 内容 > 关闭 wifi > 回到我的应用程序 > 回到 webview 活动 > 这里我收到一条错误消息“网页不可用”。

清单中的权限:

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>

isNetworkAvailable() 方法:

private boolean isNetworkAvailable() {
        ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
        return activeNetworkInfo != null && activeNetworkInfo.isConnected();
    }

【问题讨论】:

    标签: android caching webview


    【解决方案1】:

    Google 设置了cache-control:no-cache 标头,因此其内容不会被 WebView 缓存。尝试使用可以控制响应的服务器。

    其他几点说明:

    • AppCache 不是一般的网络缓存,你的网络应用必须明确使用它(见docs);因此打开它无济于事;

    • 没有必要从shouldOverrideUrlLoading 内部执行loadUrl(有时会导致令人惊讶的结果),您可以直接返回false

    • 不知道您为什么假设网络缓存使用特定方案来命名文件——这是一个实现细节。

    【讨论】:

    • 我按照您的说明进行操作,现在可以使用了,谢谢 Mikhail。我认为我的主要问题是 ShouldOverrideUrlLoading 中的 loadUrl。
    猜你喜欢
    • 1970-01-01
    • 2011-12-22
    • 1970-01-01
    • 1970-01-01
    • 2013-08-31
    • 2012-09-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多