WebView联机时加载网站,脱机时加载本地文件


74

我实际上是Java编程的新手,但是我在这里一直遵循几种解决问题的方法,但是没有找到适合我的情况的解决方案,而且我似乎无法正确地编写代码。

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

同时,我希望手机在在线时覆盖本地页面,以便离线本地页面总是更新到手机最后一次连接到互联网的时间。

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

非常感谢。

Answers:


129

在我看来,这听起来像是一种简单的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

@jenzz:我的解决方案有两个问题。首先,就我而言,出现在缓存目录(外部sd卡)中的是一个名为的文件ApplicationCache.db。不应该更大吗?缓存可能存储在其他地方了吗?其次,.setAppCacheMaxSize()API18中已弃用该方法,不知道该如何添加更多
chche

以后配额将自动管理。无需设置它们。
anshad 2014年

5
“对我来说,这听起来像是一种简单的Webview缓存机制。” 暴徒生活8)
AndBecaPine 2015年

2
当应用程序被终止并以离线模式再次加载时,对我不起作用。好的工作仍然+1
天网

22

在某些情况下,WebView不能本地缓存。如果页面标题包含以下字段,则WebView将无法缓存该页面的内容。缓存控制:无存储,无缓存语法:无缓存

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.