当前位置:首页 » 文件管理 » webview页面缓存在哪里

webview页面缓存在哪里

发布时间: 2024-08-21 12:26:51

⑴ Android 下的 WebView 中数据如何保存

1、Android中的WebView控件当加载html时候,会在data/应用package下生成database与cache两个文件夹如下图如示:

Url记录是保存在webviewCache.db里,而url的内容是保存在webviewCache文件夹下。
WebView中存在着两种缓存:网页数据缓存(存储打开过的页面及资源)、H5缓存(即AppCache)。



2、缓存构成
/data/data/package_name/cache/
/data/data/package_name/database/webview.db

/data/data/package_name/database/webviewCache.db

webview 会将浏览过的网页url以及网页文件(css、图片、js等)保存到数据库表中。


缓存模式(5种)
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,都使用缓存中的数据。

⑵ 微信小程序 webview缓存

本人公司小程序中的webview网页更新时,常常因缓存原因无法实时更新,极其影响使用。
于是遍尝网上能找到的方法。

总结:
1:小程序webview中的网站添加时间戳后缀,
2:webview的网页是用vue写的,路由默认的是hash模式,需要改为history模式。
3:成功,可以实时更新

⑶ android 怎样获取webview的缓存

请求的url记录是保存在webviewCache.db,而url的内容是保存在webviewCache文件夹下.

为了便于理解,接下来模拟一个案例,定义一个html文件,在里面显示一张图片,用WebView加载出来,然后再试着从缓存里把这张图片读取出来并显示。

第一步:新建一个Android工程命名为WebViewCache.目录结构如下:

第二步:在assets目录下新建一个html文件,命名为index.html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>WebViewCacheDemo</title>

<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="this is my page">
<meta http-equiv="content-type" content="text/html; charset=UTF-8">

</head>

<body>
<img src="http://img04.taobaocdn.com/imgextra/i4/608825099/T2nGXBXXpaXXXXXXXX_!!608825099.jpg_310x310.jpg"/>
</body>
</html>

第三步:修改main.xml布局文件,一个WebView控件一个Button(点击加载缓存图片用),代码如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="fill_parent"
android:layout_height="fill_parent">
<WebView android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="@+id/webView"/>
<Button android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="从缓存读取图片"
android:id="@+id/button"/>
</LinearLayout>

第四步:修改主核心程序WebViewCacheDemo.java,这里我只加载了index.html文件,按钮事件暂时没写,代码如下:

package com.ljq.activity;

import java.io.File;
import java.io.FileInputStream;

import android.app.Activity;
import android.app.Dialog;
import android.app.AlertDialog.Builder;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.view.View;
import android.webkit.WebView;
import android.widget.Button;
import android.widget.ImageView;

public class WebViewActivity extends Activity {
private WebView webView;
private static final String url="file:///android_asset/index.html";

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

webView=(WebView)findViewById(R.id.webView);
webView.loadUrl(url);
}
}

第五步:在AndroidMainifest.xml文件中加访问网络的权限:
<uses-permission android:name="android.permission.INTERNET" />

⑷ WebView自动缓存-清除缓存

iOS的Webview加载HTML时会自动缓存JS、CSS等文件,当下次加载HTML时会根据请求的缓存策略是否使用缓存本地的JS和CSS,如果本地有缓存,那么直接返回本地资源(判断是否过期);如果没有本地缓存则向服务器请求地址。
1、NSURLRequestCachePolicy 指定缓存逻辑。URL加载系统提供了一个磁盘和内存混合的缓存,来响应网络请求。
2、 = 0 默认缓存策略
3、 不使用本地缓存数据
4、 直接加载源数据
5、 指定已存的缓存数据应该用来响应请求,不管它的生命时长和过期时间。
6、 指定已存的缓存数据用来满足请求,不管生命时长和过期时间。

也可以使用这个方法清除单个请求的缓存

之前遇到一种情况,app端加载服务器一个网页,js调用http接口没有传参数报错了,服务端更新之后安卓重新加载没有问题,iOS端一直加载都会报错,卸载重装之后就没问题了。
最后发现在沙盒的Caches目录中找到一个WebKit的文件夹,把这个文件夹删了也没问题

借鉴:
html开发变态的静态资源缓存与更新
iOS开发:解决UIWebView自动缓存导致页面不可刷新问题
iOS html5使用缓存并及时更新方案总结

⑸ 如何有效提升WebView的加载速度

在做混合应用的时候,有几个痛点,一个是无网络无法使用,还有一个是受网络环境影响的网页加载速度。今天就这两个问题,和大家交流一下自己的经验。
离线缓存
这个比较容易,开启webView的缓存功能就可以了。
WebSettings settings = webView.getSettings();
settings.setAppCacheEnabled(true);
settings.setDatabaseEnabled(true);
settings.setDomStorageEnabled(true);//开启DOM缓存,关闭的话H5自身的一些操作是无效的settings.setCacheMode(WebSettings.LOAD_DEFAULT);

这边我们通过setCacheMode方法来设置WebView的缓存策略,WebSettings.LOAD_DEFAULT是默认的缓存策略,它在缓存可获取并且没有过期的情况下加载缓存,否则通过网络获取资源。这样的话可以减少页面的网络请求次数,那我们如何在离线的情况下也能打开页面呢,这里我们在加载页面的时候可以通过判断网络状态,在无网络的情况下更改webview的缓存策略。
ConnectivityManager cm = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo info = cm.getActiveNetworkInfo();if(info.isAvailable())
{
settings.setCacheMode(WebSettings.LOAD_DEFAULT);
}else {
settings.setCacheMode(WebSettings.LOAD_CACHE_ONLY);//不使用网络,只加载缓存}

这样我们就可以使我们的混合应用在没有网络的情况下也能使用一部颤迟腔分的功能,不至于什么都显示不了了,当然如果我们将缓存做的更好一些,在网络好的时候,比如说在WIFI状态下,去后台加载一些网页缓存起来,这样处理的话,即使在无网络情况下第一次打开某些页面的时候,也能将该页面显示出来。
当然缓存资源后随之会带来一个问题,那就是资源无法及时更新,WebSettings.LOAD_DEFAULT中的页面中的缓茄衫存版本好像不是很起作用,所以我们这边可能需要自己做一个缓存版本控制。这个缓存版本控制可以放在APP版本更新中。
if (upgrade.cacheControl > cacheControl)
{
webView.clearCache(true);//删除DOM缓存
VersionUtils.clearCache(mContext.getCacheDir());//删除APP缓存
try
{
mContext.deleteDatabase("webview.db");//删除数据库缓存
mContext.deleteDatabase("webviewCache.db");
} catch (Exception e)
{
}
}

预加载
有时候一个页面资源比较多,图片,CSS,js比较多,还引用了JQuery这种庞然巨兽,从加载到页面渲染完成需要比较长的时间,有一个解决方案是将这些资源打包进APK里面,然后当页面加载这些资源的时候让它从本地获取,这样可以提升加载速度也能减少服务器压力。重写WebClient类中的shouldInterceptRequest方法,再将这旦哪个类设置给WebView。
webView.setWebViewClient(new WebViewClient()
{ @Override
public WebResourceResponse shouldInterceptRequest(WebView view, String url)
{ if (url.contains("[tag]"))
{
String localPath = url.replaceFirst("^http.*[tag]\\]", ""); try
{
InputStream is = getApplicationContext().getAssets().open(localPath);
Log.d(TAG, "shouldInterceptRequest: localPath " + localPath);
String mimeType = "text/javascript"; if (localPath.endsWith("css"))
{
mimeType = "text/css";
} return new WebResourceResponse(mimeType, "UTF-8", is);
} catch (Exception e)
{
e.printStackTrace(); return null;
}
} else
{ return null;
}

}
});

这里我们队页面中带有特殊标记的请求进行过滤替换,也就是上面代码中的[tag],这个可以跟做后台开发的同事约定好来就行了。对图片资源或者其他资源进行替换也是可以的。补充一个小点可以通过settings.setLoadsImagesAutomatically(true);来设置在页面装载完成之后再去加载图片。
H5优化
Android的OnPageFinished事件会在Javascript脚本执行完成之后才会触发。如果在页面中使 用JQuery,会在处理完DOM对象,执行完$(document).ready(function() {});事件自会后才会渲染并显示页面。而同样的页面在iPhone上却是载入相当的快,因为iPhone是显示完页面才会触发脚本的执行。所以我们这边的解决方案延迟JS脚本的载入,这个方面的问题是需要Web前端工程师帮忙优化的,网上应该有比较多LazyLoad插件,这里放一个比较老的链接Painless JavaScript lazy loading with LazyLoad,同样也放上一小段前端代码,仅供参考。
<script src="/css/j/lazyload-min.js" type="text/javascript"></script><script type="text/javascript" charset="utf-8">
loadComplete() { //instead of document.read();
}
function loadscript() {
LazyLoad.loadOnce([ '/css/j/jquery-1.6.2.min.js', '/css/j/flow/jquery.flow.1.1.min.js', '/css/j/min.js?v=2011100852'
], loadComplete);
}
setTimeout(loadscript,10);</script>

⑹ android webview加载url怎么缓存

当我们加载Html时候,会在我们data/应用package下生成database与cache两个文件夹:

我们请求的Url记录是保存在webviewCache.db里,而url的内容是保存在webviewCache文件夹下.

WebView中存在着两种缓存:网页数据缓存(存储打开过的页面及资源)、H5缓存(即AppCache)。


一、网页缓存


1、缓存构成

/data/data/package_name/cache/

/data/data/package_name/database/webview.db

/data/data/package_name/database/webviewCache.db



综合可以得知 webview 会将我们浏览过的网页url已经网页文件(css、图片、js等)保存到数据库表中


缓存模式(5种)

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模式下,无论是否有网络,只要本地有缓存,都使用缓存。本地没有缓存时才从网络上获取。

www.360.com.cn的cache-control为max-age=60,在两种模式下都使用本地缓存数据。


总结:根据以上两种模式,建议缓存策略为,判断是否有网络,有的话,使用LOAD_DEFAULT,无网络时,使用LOAD_CACHE_ELSE_NETWORK。

设置WebView缓存模式

privatevoidinitWebView(){

mWebView.getSettings().setJavaScriptEnabled(true);
mWebView.getSettings().setRenderPriority(RenderPriority.HIGH);
mWebView.getSettings().setCacheMode(WebSettings.LOAD_DEFAULT);//设置缓存模式
//开启DOMstorageAPI功能
mWebView.getSettings().setDomStorageEnabled(true);
//开启databasestorageAPI功能
mWebView.getSettings().setDatabaseEnabled(true);
StringcacheDirPath=getFilesDir().getAbsolutePath()+APP_CACAHE_DIRNAME;
//StringcacheDirPath=getCacheDir().getAbsolutePath()+Constant.APP_DB_DIRNAME;
Log.i(TAG,"cacheDirPath="+cacheDirPath);
//设置数据库缓存路径
mWebView.getSettings().setDatabasePath(cacheDirPath);
//设置ApplicationCaches缓存目录
mWebView.getSettings().setAppCachePath(cacheDirPath);
//开启ApplicationCaches功能
mWebView.getSettings().setAppCacheEnabled(true);
}
清除缓存

/**
*清除WebView缓存
*/
publicvoidclearWebViewCache(){

//清理Webview缓存数据库
try{
deleteDatabase("webview.db");
deleteDatabase("webviewCache.db");
}catch(Exceptione){
e.printStackTrace();
}

//WebView缓存文件
FileappCacheDir=newFile(getFilesDir().getAbsolutePath()+APP_CACAHE_DIRNAME);
Log.e(TAG,"appCacheDirpath="+appCacheDir.getAbsolutePath());

FilewebviewCacheDir=newFile(getCacheDir().getAbsolutePath()+"/webviewCache");
Log.e(TAG,"webviewCacheDirpath="+webviewCacheDir.getAbsolutePath());

//删除webview缓存目录
if(webviewCacheDir.exists()){
deleteFile(webviewCacheDir);
}
//删除webview缓存缓存目录
if(appCacheDir.exists()){
deleteFile(appCacheDir);
}
}
热点内容
手机存储满了 发布:2024-09-12 23:19:24 浏览:645
服务器如何禁止ip路由 发布:2024-09-12 23:03:02 浏览:322
python有哪些方向 发布:2024-09-12 22:53:06 浏览:966
编译类高级语言源程序 发布:2024-09-12 21:52:09 浏览:478
视频服务器怎么设置公网 发布:2024-09-12 21:46:21 浏览:12
linux服务器如何切入数据库 发布:2024-09-12 21:23:38 浏览:184
如何给路由器配置相关命令 发布:2024-09-12 21:10:23 浏览:676
数据库字段的属性 发布:2024-09-12 21:04:23 浏览:387
云服务器备案吗 发布:2024-09-12 21:03:19 浏览:817
如何用旧电脑安装家庭服务器 发布:2024-09-12 20:57:54 浏览:48