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 ...
随机推荐
- 集成支付宝,报警告warning: (arm64) /Users/tommy/Desktop/Project/ios-msdk-git/AlipaySDK4Standard/AlipaySDK/Library/UTDI
集成支付宝的时候遇到的问题,找到了解决办法,还说明了原因,非常好,觉得应该记下来,反正以我的记性下次一定是会忘光光哒~ 1) Go to Build Settings -> Build Opt ...
- Spring Boot实战笔记(二)-- Spring常用配置(Scope、Spring EL和资源调用)
一.Bean的Scope Scope描述的是Spring容器如何新建Bean实例的.Spring的Scope有以下几种,通过@Scope注解来实现. (1)Singleton:一个Spring容器中只 ...
- @Scheduled cron表达式
一.Cron详解: Cron表达式是一个字符串,字符串以5或6个空格隔开,分为6或7个域,每一个域代表一个含义,Cron有如下两种语法格式: 1.Seconds Minutes Hours Dayof ...
- keystonejs开发中解决bug--版本要对应
今天要调试bug,先说明一下背景!有需求要修改keystonejs的后台管理页面,然后是看官方文档知道后台管理也是react+redux.然后为了加强后台管理页的功能(如汉化),然后将keystone ...
- SpringMVC中的异常处理
springmvc在处理请求过程中出现异常信息交由异常处理器进行处理,自定义异常处理器可以实现一个系统的异常处理逻辑. 1. 异常处理思路 系统中异常包括两类:预期异常和运行时异常RuntimeExc ...
- 解决redis connection refused: connect无法连接redis
环境 VM VirtualBox安装虚拟机CentOS 7 1.Redis.conf配置文件中 注释掉 bind 127.0.0.1 2.防火墙关闭(或添加可访问的端口,具体不在此描述) 最后一个坑 ...
- Linux用户登录日志查询
# 1 utmp.wtmp.btmp文件 Linux用户登录信息放在三个文件中: 1 /var/run/utmp:记录当前正在登录系统的用户信息,默认由who和w记录当前登录用户的信息,uptime记 ...
- 优雅地实现CSS Animation delay
今天写一个css动画时遇到一个有意思的问题,记录如下: 1.需求: 等待元素A的动画加载完,再加载B元素的动画(下图中A为大熊猫,B为下方卡片) 先来看下最后的效果啦: 2.初始思路: 在B元素的动画 ...
- What is the best way to handle Invalid CSRF token found in the request when session times out in Spring security
18.5.1 Timeouts One issue is that the expected CSRF token is stored in the HttpSession, so as soon a ...
- springBoot+springSecurity 数据库动态管理用户、角色、权限
使用spring Security3的四种方法概述 那么在Spring Security3的使用中,有4种方法: 一种是全部利用配置文件,将用户.权限.资源(url)硬编码在xml文件中,已经实现过, ...