android开发中难免会使用一些网页来展示某些数据,然而有的网页内容可能是基本上不会变的,每次加载既耗资源又耗流量,假如网络不好用户体验还会很差,这个时候适当的用一些缓存就很有必要了,无论是android还是iOS的WebView都很好的实现了离线缓存的功能,我们要做的只是设置一下~
android 中WebView缓存需要手动打开,
String cacheDirPath = getFilesDir().getAbsolutePath() + APP_CACAHE_DIRNAME;
WebSettings settings = webView.getSettings();
//设置数据库缓存路径 settings.setDatabasePath(cacheDirPath); //设置 App Caches 缓存目录a settings.setAppCachePath(cacheDirPath); //开启 App Caches 功能 settings.setAppCacheEnabled(true);
这样就打开了缓存功能,接下来就是设置缓存模式了,android中共有五种缓存模式
LOAD_CACHE_ONLY: 不使用网络,只读取本地缓存数据
LOAD_DEFAULT: 根据cache-control决定是否从网络上取数据。
LOAD_CACHE_NORMAL: API level 17中已经废弃, 从API level 11开始作用同LOAD_DEFAULT模式
LOAD_NO_CACHE: 不使用缓存,只从网络获取数据.
LOAD_CACHE_ELSE_NETWORK,只要本地有,无论是否过期,或者no-cache,都使用缓存中的数据。
如:www.taobao.com的cache-control为no-cache,在模式LOAD_DEFAULT下,无论如何都会从网络上取数据,如果没有网络,就会出现错误页面;在LOAD_CACHE_ELSE_NETWORK模式下,无论是否有网络,只要本地有缓存,都使用缓存。本地没有缓存时才从网络上获取。
开发者可以根据自己app 的需要来设置不同的缓存模式,我的实现是如果网络是Wi-Fi,使用默认模式,如果是3g或没有网络则优先加载缓存
if (isWIFIkAvailable(WebViewLoadActivity.this)) {
//当前有可用网络
settings.setCacheMode(WebSettings.LOAD_DEFAULT); //设置 缓存模式( 根据cache-control决定是否从网络上取数据。)
} else {
//当前没有可用网络
settings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK); //设置 缓存模式(只要本地有,无论是否过期,或者no-cache,都使用缓存中的数据。)
}
这样做的好处是既能保证加载速度又能节省流量,其实最开始想要实现的是如果要加载的网页资源在一定时间内没有变化就加载缓存的资源,如果有变化则加载网络上的资源,理想的状态是通过设置请求消息头if-Modified-Since来实现,不过没有成功,如果哪位看官了解,请在下边留下评论,万分感谢~