1

我想在未连接互联网时从缓存中加载网站。这是我在 onCreate 中设置 webview 的方法:

    browse.getSettings().setJavaScriptEnabled(true);
    browse.getSettings().setPluginsEnabled(true);
    browse.getSettings().setLoadWithOverviewMode(true);
    browse.getSettings().setUseWideViewPort(true);
    browse.getSettings().setBuiltInZoomControls(true);
    browse.getSettings().setSupportZoom(true);
    browse.setScrollBarStyle(WebView.SCROLLBARS_OUTSIDE_OVERLAY);
    browse.setScrollbarFadingEnabled(true);
    browse.getSettings().setLoadsImagesAutomatically(true);
    browse.getSettings().setAppCacheMaxSize(1024 * 1024 * 100);
    browse.getSettings().setAppCacheEnabled(true);

    if (cm.getActiveNetworkInfo().isConnected())
        browse.getSettings().setCacheMode(WebSettings.LOAD_DEFAULT);
    else
        browse.getSettings().setCacheMode(
                WebSettings.LOAD_CACHE_ELSE_NETWORK);

    browse.setWebViewClient(new WebViewClient() {

        @Override
        public void onPageStarted(WebView view, String url, Bitmap favicon) {
            // TODO Auto-generated method stub
            super.onPageStarted(view, url, favicon);
            t.setVisibility(TextView.VISIBLE);
        }

        @Override
        public void onPageFinished(WebView view, String url) {
            super.onPageFinished(view, url);
            t.setVisibility(TextView.GONE);
        }
    });

    try {
        browse.loadUrl(address);
    } catch (Exception e) {
        e.printStackTrace();
    }

这是我正在关注的教程,即使重新启动浏览器,我也会尝试加载以前访问过的网页。不工作!请帮我。

PS:我已经搜索了SO上的所有相关代码,它们都不起作用。

4

3 回答 3

5

在清单文件中声明以下权限:

android.permission.ACCESS_NETWORK_STATE
于 2012-08-16T20:08:19.747 回答
1

您是否尝试过 nanoHttpd 网络服务器,这是在 sdcard 或本地内存中访问网页的简单解决方案。您要做的就是将页面路径指定为 http://localhost:8081/[您的离线网页的缓存目录路径]在网页视图中

https://gist.github.com/1893396

我在 sdcard 和手机内存的页面上试过这个,希望这对你有用

于 2012-08-23T06:55:07.420 回答
1

我认为您错过了以下电话WebSettings.setAppCacheEnabled(true):)

另外,我认为在调用setCacheMode()之前检查连接和调用可能会更好,loadUrl()而不是在你的onPageStarted()方法中(似乎为时已晚)。

最后,我不确定您是否getCacheDir()需要覆盖,因为我相信您只是在覆盖中调用默认实现。

更新:

查看问题中的更新代码后,我可以确认我有类似的代码可以正常工作。唯一显着的区别是我在检查连接时有以下代码:

    final NetworkInfo activeNetworkInfo = cm.getActiveNetworkInfo();
    if (activeNetworkInfo != null && activeNetworkInfo.isConnected()) {
        settings.setCacheMode(WebSettings.LOAD_DEFAULT);
    } else {
        settings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
    }

与您的版本相比:

    if (cm.getActiveNetworkInfo().isConnected())
        browse.getSettings().setCacheMode(WebSettings.LOAD_DEFAULT);
    else
        browse.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);

我通过在模拟器中运行并打开和关闭飞行模式进行了测试。

但是,我确实阅读了您更紧密地链接的教程(我现在明白了为什么您getCacheDir()在原始代码中覆盖)并且想知道您是否仍在调用您WebView.clearCache(true)onDestroy()Activity。如果您仍然没有修改教程中的那部分,那肯定会导致缓存似乎无法正常工作:)

于 2012-08-20T02:03:22.943 回答