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

78

我其实是Java编程新手,但我一直在跟进我的问题的解决方案,但没有找到适合我情况的,并且我似乎无法正确地编写代码。

我想要一个WebView,当手机联网时打开在线网页(例如Google),并在手机离线时打开本地HTML页面。

同时,当手机在线时,我希望它覆盖本地页面,以便离线本地页面始终更新为上次连接到互联网的时间。

有什么想法可以做到这一点吗?可能只需要指向正确的方向就可以了。

非常感谢。

2个回答

135

听起来对我来说是一个简单的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"/>

2
这真的非常完整..运行得很好!非常感谢您向我展示缓存模式。 - mstation
1
@jenzz:我对你的解决方案有两个问题。首先,在我的情况下,缓存目录(外部SD卡)中出现的所有内容都是一个名为“ApplicationCache.db”的文件。不应该更大吗?也许缓存被存储在其他地方了?其次,.setAppCacheMaxSize()这个东西在API18中已经过时了,不确定如何添加更多的缓存... - Luis A. Florit
将来的配额将自动管理,无需进行设置。 - anshad
5
听起来像是一个简单的网页视图缓存机制。thug life 8) - Andressa Pinheiro
3
离线模式下,当应用程序被强制关闭并重新加载时,它对我没有作用。但工作仍旧出色,加一分。 - Skynet
显示剩余6条评论

27

有时候 WebView 无法本地缓存。如果页面头包含以下字段,则 WebView 将无法缓存该页面的内容。Cache-Control: no-store, no-cache Pragma: no-cache

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


哇,好主意。请问你能举个例子吗? - chisom emmanuel
在我的情况下,缓存无法正常工作是因为不安全的HTTPS。 - olfek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接