Android WebView 缓存
android很多情况是使用webView用来显示界面,但是webview的加载速度略慢,想让这个webview更快一些所以需要使用缓存,在没有更新的时候使用缓存技术来提高速度。总体来讲有两个方案可以实现这个内容。1.用本地文件js,css,png替换网络请求下来的文件,2.直接使用webview的缓存。
第一种方法用本地文件js,css,png替换网络请求下来的文件是在webview的setWebViewClient里面的shouldInterceptRequest方法用本地文件进行替换。
mWebView.setWebViewClient(new WebViewClient(){
@Override
public void onPageFinished(WebView webView, String s) {
super.onPageFinished(webView, s);
mWebView.getSettings().setBlockNetworkImage(false);
//加载完成时调用
}
//新加载WebView的方法
@Override
public boolean shouldOverrideUrlLoading(final WebView webView, final String url) {
Log.e("sys","url="+url);
//判断url
if (!(url.startsWith("http") || url.startsWith("https"))) {
return true;
}
/**
* 推荐采用的新的二合一接口(payInterceptorWithUrl),只需调用一次
*/
final PayTask task = new PayTask(BaseWebActivity.this);
boolean isIntercepted = task.payInterceptorWithUrl(url, true, new H5PayCallback() {
@Override
public void onPayResult(final H5PayResultModel result) {
final String url=result.getReturnUrl();
Log.e("sys","url="+ url);
switch (result.getResultCode()) {
/*
9000——订单支付成功
8000——正在处理中
4000——订单支付失败
5000——重复请求
6001——用户中途取消
6002——网络连接出错
*/
case "4000":
webView.loadUrl("javascript:appCallJsShowOrder()");
Log.e("sys","4000");
break;
case "6001":
webView.loadUrl("javascript:appCallJsShowOrder()");
Log.e("sys","6001");
break;
case "6002":
webView.loadUrl("javascript:appCallJsShowOrder()");
Log.e("sys","6002");
break;
case "9000":
break;
}
}
}
});
/**
* 判断是否成功拦截
* 若成功拦截,则无需继续加载该URL;否则继续加载
*/
if(!isIntercepted) {
Log.e("is","update");
webView.loadUrl(url);
}
return true;
}
//获得下载列表
@Override
public WebResourceResponse shouldInterceptRequest(WebView view, String url) {
WebResourceResponse response = null;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB){
response = super.shouldInterceptRequest(view,url);
if (url.contains(".js")||url.contains(".png")||url.contains(".css")){
Log.e("fileUrl",url);
String[] arr = StrUtil.getStrArr(url,"/");
String jsFileName = arr[arr.length-1];
String[] arrEnd = StrUtil.getStrArr(jsFileName,"\\.");
if (arr.length!=0){
if(arrEnd.length != 0) {
Log.e("arr",jsFileName);
if(jsFileName.equals("fastclick.min.js")){
Log.e("fastclick","fastclick");
try {
return new WebResourceResponse("application/x-javascript","utf-8",getBaseContext().getAssets().open("fastclick.min.js"));
} catch (IOException e) {
e.printStackTrace();
}
}
if(jsFileName.equals("geolocation.min.js")){
Log.e("geolocation","geolocation");
try {
return new WebResourceResponse("application/x-javascript","utf-8",getBaseContext().getAssets().open("geolocation.min.js"));
} catch (IOException e) {
e.printStackTrace();
}
}
if(jsFileName.equals("g2.min.js")){
try {
return new WebResourceResponse("application/x-javascript","utf-8",getBaseContext().getAssets().open("g2.min.js"));
} catch (IOException e) {
e.printStackTrace();
}
}
if(jsFileName.equals("login_bg.5563a40.png")){
try {
return new WebResourceResponse("application/x-javascript","utf-8",getBaseContext().getAssets().open("login_bg.5563a40.png"));
} catch (IOException e) {
e.printStackTrace();
}
}
if(jsFileName.equals("favicon-16x16.png")){
try {
return new WebResourceResponse("application/x-javascript","utf-8",getBaseContext().getAssets().open("favicon-16x16.png"));
} catch (IOException e) {
e.printStackTrace();
}
}
if(jsFileName.equals("favicon-32x32.png")){
try {
return new WebResourceResponse("application/x-javascript","utf-8",getBaseContext().getAssets().open("favicon-32x32.png"));
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
return response;
}
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
@Override
public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {
WebResourceResponse response = null;
response = super.shouldInterceptRequest(view, request);
return response;
}
@Override
public void onReceivedError(final WebView webView, int i, String s, String s1) {
super.onReceivedError(webView, i, s, s1);
}
@Override
public void onReceivedError(WebView webView, WebResourceRequest webResourceRequest, WebResourceError webResourceError) {
super.onReceivedError(webView, webResourceRequest, webResourceError);
Log.e("sys","onReceivedError webResourceError");
}
});
2.首先设置webSetting设置成使用LOAD_DEFAULT这种缓存方式,数据从缓存中获取还是从网络中获取根据H5页面的参数判断,这样做的好处是可以动态的处理更新内容。再判断版本是否清理缓存。
//设置webview属性
private void initWebViewSettings() {
WebSettings webSetting = webView.getSettings();
webSetting.setJavaScriptEnabled(true);
webSetting.setJavaScriptCanOpenWindowsAutomatically(true);
webSetting.setAllowFileAccess(true);
webSetting.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.NARROW_COLUMNS);
webSetting.setSupportZoom(true);
webSetting.setBuiltInZoomControls(true);
webSetting.setUseWideViewPort(true);
webSetting.setSupportMultipleWindows(true);
// webSetting.setLoadWithOverviewMode(true);
webSetting.setAppCacheEnabled(true);
// webSetting.setDatabaseEnabled(true);
webSetting.setDomStorageEnabled(true);
webSetting.setGeolocationEnabled(true);
webSetting.setDatabaseEnabled(true);
webSetting.setAppCacheMaxSize(Long.MAX_VALUE);
webSetting.setTextZoom(100); webSetting.setBlockNetworkImage(true);
// webSetting.setPageCacheCapacity(IX5WebSettings.DEFAULT_CACHE_CAPACITY);
webSetting.setPluginState(WebSettings.PluginState.ON_DEMAND);
webSetting.setRenderPriority(WebSettings.RenderPriority.HIGH);
webSetting.setCacheMode(WebSettings.LOAD_DEFAULT);
String userAgent = webSetting.getUserAgentString().replace("Mobile","Snail");
webSetting.setUserAgentString(userAgent);
// this.getSettingsExtension().setPageCacheCapacity(IX5WebSettings.DEFAULT_CACHE_CAPACITY);//extension
// settings 的设计
} @Override
protected void onDestroy() {
// TODO Auto-generated method stub
if (this.mWebView != null) {
try
{
//在这里获得版本号 清除缓存
if(version!=lastVersion){
mWebView.clearCache(true);
context.deleteDatabase("webview.db");//删除数据库缓存
context.deleteDatabase("webviewCache.db");
}
}
catch (Exception e) { }
mWebView.destroy();
} }
Android WebView 缓存的更多相关文章
- Android WebView 缓存机制和模式详解
当我们加载Html时候,会在我们data/应用package下生成database与cache两个文件夹: 我们请求的Url记录是保存在webviewCache.db里,而url的内容是保存在webv ...
- Android WebView缓存分析
http://blog.csdn.net/a345017062/article/details/8703221 WebView的缓存可以分为页面缓存和数据缓存. 页面缓存是指加载一个网页时的htm ...
- Android webView 缓存 Cache + HTML5离线功能 解决
时间 -- :: CSDN博客 原文 http://blog.csdn.net/moubenmao/article/details/9076917 主题 Android HTML5 WebView的缓 ...
- 【android】WebView缓存数据收集
Android WebView 缓存 Android高手进阶教程(二十四)之---Android WebView的缓存!!! Android webView 缓存 Cache + HTML5离线功能 ...
- H5 和移动端 WebView 缓存机制解析与实战
本文来自于腾讯Bugly公众号(weixinBugly),未经作者同意,请勿转载,原文地址:https://mp.weixin.qq.com/s/qHm_dJBhVbv0pJs8Crp77w 作者:叶 ...
- Android WebView 优化页面加载效果
目前带有Web功能的APP越来越多,为了能够更好的使用WebView展示页面,可以考虑做相关的优化:WebView 缓存,资源文件本地存储,客户端UI优化. 可能有些人会说,为什么不做Native的, ...
- Android——WebView
WebView用途 通过Intent调用系统浏览器: 引言: Uri uri = Uri.parse(url);//url为你要链接的地址 Intent intent = new Intent(Int ...
- Android webview通过http get下载文件下载两次的问题及解决方法
一.现象 一般通过Android webview进行下载文件的方法是 1.重写DownloadListener的onDownloadStart方法,在onDownloadStart方法中弹出对话框提示 ...
- Android WebView 开发详解(一)
转载请注明出处 http://blog.csdn.net/typename/article/details/39030091 powered by meichal zhao 概览: Android ...
随机推荐
- PAT1081:Rational Sum
1081. Rational Sum (20) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue Given N ...
- spring cloud中利用sidecar整合异构语言(转)
用spring cloud sidecar的整合异构语言,以前做过没有做笔记,现在再做由于各种坑又浪费了一天,这里记一下 首先是官网:http://cloud.spring.io/spring-clo ...
- mac 上安装 nvm 遇到的坑
本人之前在 mac 上已经装过 nvm 了,今天帮朋友在他电脑上装,由于是新版本,没想到有点坑. ** 一定要参考官方文档 一.命令行安装 (图片来自 github ) 意思是,无论你安装还是更新 ...
- .Net Core微服务系列--开篇
记得原来有个项目是用wcf做的分布式,不仅横向根据业务拆分了,纵向把业务处理.数据访问等也拆分了成不同的服务,这个是当时公司的产品我也只是一个小小的开发人员所以就不做太多的评论,只是不得不吐槽下调试真 ...
- jdk下载以及配置
http://jingyan.baidu.com/article/6dad5075d1dc40a123e36ea3.html
- String是值传递还是引用传递
String是值传递还是引用传递 今天上班时,同事发现了一个比较有意思的问题.他把一个String类型的参数传入方法,并在方法内改变了引用的值. 然后他在方法外使用这个值,发现这个String还是之前 ...
- CSS布局十八般武艺都在这里了
CSS布局十八般武艺都在这里了 Shelley Lee 4 个月前 布局是CSS中一个重要部分,本文总结了CSS布局中的常用技巧,包括常用的水平居中.垂直居中方法,以及单列布局.多列布局的多种实现方式 ...
- ECMAScript 6 入门 ----Generator 函数
本文转自:阮一峰老师的ECMAScript 6 入门,有时间可以看下评论! Generator 函数 简介 基本概念 Generator函数是ES6提供的一种异步编程解决方案,语法行为与传统函数完全不 ...
- Android 进阶 教你打造 Android 中的 IOC 框架 【ViewInject】 (上)
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/39269193,本文出自:[张鸿洋的博客] 1.概述 首先我们来吹吹牛,什么叫Io ...
- C++雾中风景9:emplace_back与可变长模板
C++11的版本在vector容器添加了emplace_back方法,相对于原先的push_back方法能够在一定程度上提升vector容器的表现性能.所以我们从STL源码角度来切入,看看这两种方法有 ...