WebView在线加载网站,离线时加载本地文件

时间:2013-02-03 08:17:26

标签: android webview local offline auto-update

我实际上是Java编程的新手,但我一直在关注我的问题的几个解决方案,但没有找到一个适合我的情况,我似乎无法正确地解决代码。

我希望有一个WebView可以在手机上线时打开在线页面(例如Google),并在手机离线时打开本地HTML页面。

同时虽然我希望手机在线时覆盖本地页面,但离线本地页面始终更新为上次手机连接到互联网时。

关于如何做到这一点的任何想法? 一些简单的指向正确的方向可能有所帮助。

非常感谢。

3 个答案:

答案 0 :(得分:115)

这听起来像是一个简单的webview缓存机制。

以下内容可以满足您的需求:

WebView webView = new WebView( context );
webView.getSettings().setAppCacheMaxSize( 5 * 1024 * 1024 ); // 5MB
webView.getSettings().setAppCachePath( getApplicationContext().getCacheDir().getAbsolutePath() );
webView.getSettings().setAllowFileAccess( true );
webView.getSettings().setAppCacheEnabled( true );
webView.getSettings().setJavaScriptEnabled( true );
webView.getSettings().setCacheMode( WebSettings.LOAD_DEFAULT ); // load online by default

if ( !isNetworkAvailable() ) { // loading offline
    webView.getSettings().setCacheMode( WebSettings.LOAD_CACHE_ELSE_NETWORK );
}

webView.loadUrl( "http://www.google.com" );

方法isNetworkAvailable()检查活动网络连接:

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

最后,不要忘记将以下三个权限添加到AndroidManifest.xml

<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"/>

答案 1 :(得分:17)

这里是WebView无法本机缓存的情况。如果页眉包含以下字段,则WebView将无法缓存该页面中的内容。 Cache-Control:no-store,no-cache Pragma:no-cache

在这种情况下,您必须修改服务器上的页面属性以解决缓存问题。

答案 2 :(得分:0)

我知道这是一篇过时的文章,但是有点适合我想做的事情。

我有一个控制某些家庭自动化设备的Web视图。目前,页面仅使用meta刷新每5分钟刷新一次。

问题在于,当没有移动信号时,您只会得到一个错误页面,因此该应用程序需要终止并重新打开。

这看起来可能与一件事情分开。如果我使用网页的缓存版本,然后在手机离线时按按钮提高加热温度,那会发生什么?它会一直保持动作直到它联机然后再发送吗?还是会全部不同步?

如果是后者,有办法克服吗?