Android WebView实现离线加载功能

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来实现,不过没有成功,如果哪位看官了解,请在下边留下评论,万分感谢~

 
 

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
要在 Android WebView 实现离线加载原来的缓存页面,你可以使用以下步骤: 1. 设置 WebView 的缓存模式为 `LOAD_CACHE_ELSE_NETWORK`,这样 WebView 会优先加载缓存,如果缓存不存在才从网络加载数据。可以使用 `setCacheMode` 方法设置缓存模式: ```java webView.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK); ``` 2. 确保 WebView 启用了 DOM 存储和数据库存储功能,这样可以在离线时仍然能够使用相关的本地存储数据。可以使用以下方法启用这些功能: ```java webView.getSettings().setDomStorageEnabled(true); webView.getSettings().setDatabaseEnabled(true); ``` 3. 在加载 WebView 的网页之前,检查设备的网络连接状态。如果设备处于离线状态,你可以手动加载缓存的页面,否则 WebView 将按照缓存模式加载页面。示例代码如下: ```java ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo networkInfo = cm.getActiveNetworkInfo(); if (networkInfo == null || !networkInfo.isConnected()) { // 设备离线状态 webView.loadUrl("file:///android_asset/offline.html"); // 加载离线页面 } else { // 设备在线状态,WebView 根据缓存模式加载网页 webView.loadUrl("https://example.com"); // 加载网页 } ``` 在上述代码,如果设备处于离线状态,则加载位于 assets 目录下的 offline.html 页面,你可以根据需要替换为你自己的离线页面路径。 通过以上步骤,当设备处于离线状态时,WebView加载之前缓存的页面,而不是尝试从网络加载新的数据。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值