Android 以脱机模式加载网站

Android 以脱机模式加载网站,android,android-webview,android-internet,Android,Android Webview,Android Internet,我想在internet未连接时从缓存加载网站。以下是我如何在onCreate中设置webview: browse.getSettings().setJavaScriptEnabled(true); browse.getSettings().setPluginsEnabled(true); browse.getSettings().setLoadWithOverviewMode(true); browse.getSettings().setUseWideViewPo

我想在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();
    }
下面是我正在关注的问题,即使重新启动浏览器,我也会尝试加载以前访问过的网页。不行!请帮帮我


注意:我已经搜索了所有相关代码,所以没有一个有效。

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

android.permission.ACCESS_NETWORK_STATE

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

android.permission.ACCESS_NETWORK_STATE

我想你错过了打电话给:

另外,我认为最好在调用loadUrl之前检查连接性并调用setCacheMode,而不是在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,我想知道您是否仍然在活动的onDestroy中调用WebView.clearCachetrue。如果您仍然未修改教程中的该部分,则肯定会导致缓存不工作:

我认为您错过了对以下内容的调用:

另外,我认为最好在调用loadUrl之前检查连接性并调用setCacheMode,而不是在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,我想知道您是否仍然在活动的onDestroy中调用WebView.clearCachetrue。如果您仍然未修改教程中的该部分,则肯定会导致缓存无法工作:

您是否尝试过nanoHttpd Web服务器,在SD卡或本地内存中访问网页是一个简单的解决方案。。您只需将页面的路径指定为,http://localhost:8081/webview中的[脱机网页的缓存直接路径]


我在SD卡和手机内存中的页面上尝试了这一点,希望这对您有用。

您尝试过nanoHttpd Web服务器吗,在SD卡或本地内存中访问网页是一个简单的解决方案。。您只需将页面的路径指定为,http://localhost:8081/webview中的[脱机网页的缓存直接路径]


我在SD卡和手机内存中的页面上尝试了这个方法,希望这个方法对您有用

08-16 15:03:17.080:E/AndroidRuntime2827:原因:java.lang.SecurityException:ConnectivityService:用户10056和当前进程都没有android.permission.ACCESS\u NETWORK\u状态。08-16 15:03:17.080:E/AndroidRuntime2827:原因:java.lang.SecurityException:ConnectionVityService:用户10056和当前进程都没有android.permission.ACCESS\u NETWORK\u状态。这次应用程序没有崩溃,但是这个方法没有达到它的目的,页面没有在离线模式下加载。logcat中没有任何奇怪的东西。它显示连接互联网时接收到数据,未连接互联网时不显示任何内容。这次应用程序没有崩溃,但此方法无法实现其目的,页面未在脱机模式下加载。logcat中没有任何奇怪的内容。它显示数据在连接互联网时被接收,而在未连接互联网时什么也不显示。它工作了吗?我看到你删除了一条评论,说它仍然不起作用。不,它没有,我删除了评论,意识到要求某人修复你的源代码不适合这个网站,不是吗?啊,我以为你删除了它,因为它不知怎的起了作用:嗯,你介意用我建议的更改来更新你问题中的代码,但仍然不起作用吗?它起作用了吗?我看到你删除了一条评论,说它仍然不起作用。不,它没有,我删除了评论,意识到要求某人修复你的源代码不适合这个网站,不是吗?啊,我以为你删除了它,因为它不知怎的起了作用:嗯,你介意用我建议的更改来更新问题中的代码,但仍然不起作用吗?