以脱机模式加载网站

时间:2012-08-16 19:55:29

标签: android android-webview android-internet

我想在未连接互联网时从缓存加载网站。以下是我在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();
    }

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

P.S:我搜索了SO上的所有相关代码,但都没有。

3 个答案:

答案 0 :(得分:5)

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

android.permission.ACCESS_NETWORK_STATE

答案 1 :(得分: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() 1}你的活动。如果您仍然没有修改教程中的那部分,那肯定会导致缓存看起来不起作用:)

答案 2 :(得分:1)

您是否尝试过nanoHttpd网络服务器,这是获取SD卡或本地内存访问网页的简单解决方案..您要做的就是提供页面路径,http:// localhost:8081 / [您的缓存直接路径到webview中的离线网页

https://gist.github.com/1893396

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