【so easy~】 Webview离线功能(优先cache缓存+cache缓存管理)!

在做Webview显示服务器的html功能时 需要加入离线功能。

http://androiddada.iteye.com/

开始思路很狭隘,以为一定应该是从服务器得到的html文件,下载到本地后加载~

但是这样不能离线查看图片,因为图片数据并不再html中,只是连接地址。

后来,经过上网各种搜寻学习,发现原来Webview有自己的缓存,如图:

 



 在手机本地 data/data/包名/cache/webviewCache 中放的是Webview显示过的图片。我们可以把它导出,后缀改成对应图片的格式 打开看看~

 

而databases中的webviewCache.db 中放的就是图片地址和图片名字对应等信息 的表~ 导出后也可用SQLite Database Browser 等工具查看

 

1.优先缓存 

好了,这里你是不是想问:既然这些图片已经存在手机缓存里面了,为什么Webview不能再把它显示出来呢?

这里我们需要设置下:

 

 

WebSettings webSettings= webView.getSettings();

webSettings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);

//WebView.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE); 默认不使用缓存!

 

LOAD_CACHE_ELSE_NETWORK的意思是:

 

Use cache if content is there, even if expired (eg, history nav) If it is not in the cache, load from network. Use with setCacheMode(int).

如果内容已经存在cache 则使用cache,即使是过去的历史记录。如果cache中不存在,从网络中获取!

 

所以加上这句,不仅可以使用cache离线显示用户浏览过的内容,还可以在有网络的情况下优先调用缓存,为用户减少流量!~

 

我有些费解的是,这个设置在我看来是很有利于用户体验的 为什么google不把它设置成默认的呢? 还需要开发者手动打开。猜想可能是因为相同页面可能会更新的原因!

 

如果离线加载出现乱码 可参考: http://androidturing.iteye.com/blog/1280656

 

http://androiddada.iteye.com/

2.缓存管理:

(1)clearCacheFolder(Activity.getCacheDir(), System.currentTimeMillis());//删除此时之前的缓存.

 

 

// clear the cache before time numDays  
private int clearCacheFolder(File dir, long numDays) {   
int deletedFiles = 0;   
if (dir!= null && dir.isDirectory()) {   
try {   
for (File child:dir.listFiles()) {   
if (child.isDirectory()) {   
deletedFiles += clearCacheFolder(child, numDays);  
}  
  
if (child.lastModified() < numDays) {   
if (child.delete()) {   
deletedFiles++;  
}  
}  
}  
} catch(Exception e) {   
e.printStackTrace();  
}  
}  
return deletedFiles;   
}  

 

(2) 退出应用前删除缓存的方法!

 

 

File file = CacheManager.getCacheFileBaseDir();  
  if (file != null && file.exists() && file.isDirectory()) { for (File item : file.listFiles()) { item.delete();  
  }  
  file.delete();  
  }  
  context.deleteDatabase("webview.db");  
  context.deleteDatabase("webviewCache.db");  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
WebView 离线缓存是指将 WebView 加载的网页内容缓存到本地,在没有网络连接的情况下仍然可以访问已缓存的网页。离线缓存可以提高用户体验,减少用户等待时间,同时也可以减少网络流量消耗。 在 Android 中实现 WebView 离线缓存可以通过以下步骤: 1. 在 AndroidManifest.xml 文件中添加网络权限和写入外部存储器权限: ``` <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> ``` 2. 在 WebView 中启用缓存: ```java webView.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK); ``` 3. 在 WebViewClient 中加载缓存: ```java webView.setWebViewClient(new WebViewClient() { @Override public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) { super.onReceivedError(view, request, error); if (request.isForMainFrame()) { view.loadUrl("file:///android_asset/error.html"); } } @Override public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) { super.onReceivedSslError(view, handler, error); handler.proceed(); } @Override public void onPageFinished(WebView view, String url) { super.onPageFinished(view, url); webView.saveWebArchive(getCacheFilePath(url)); } @Override public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) { String url = request.getUrl().toString(); String filePath = getCacheFilePath(url); if (filePath != null) { try { InputStream inputStream = new FileInputStream(filePath); String mimeType = URLConnection.guessContentTypeFromName(filePath); return new WebResourceResponse(mimeType, "UTF-8", inputStream); } catch (FileNotFoundException e) { e.printStackTrace(); } } return super.shouldInterceptRequest(view, request); } }); ``` 4. 缓存网页内容: ```java private String getCacheFilePath(String url) { String fileName = URLEncoder.encode(url); String path = Environment.getExternalStorageDirectory().getAbsolutePath() + "/webview_cache/"; File dir = new File(path); if (!dir.exists()) { dir.mkdir(); } File file = new File(dir, fileName); if (file.exists()) { return file.getAbsolutePath(); } return null; } ``` 在加载网页时,先判断是否有缓存,如果有则加载缓存,否则从网络加载。在加载完成后,将网页内容保存到本地。在下次加载相同网页时,先从本地读取缓存,如果有更新则从网络加载

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值