当我们加载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 缓存模式

private void initWebView() {     mWebView.getSettings().setJavaScriptEnabled(true); mWebView.getSettings().setRenderPriority(RenderPriority.HIGH); mWebView.getSettings().setCacheMode(WebSettings.LOAD_DEFAULT);  //设置 缓存模式 // 开启 DOM storage API 功能 mWebView.getSettings().setDomStorageEnabled(true); //开启 database storage API 功能 mWebView.getSettings().setDatabaseEnabled(true);  String cacheDirPath = getFilesDir().getAbsolutePath()+APP_CACAHE_DIRNAME;
//      String cacheDirPath = getCacheDir().getAbsolutePath()+Constant.APP_DB_DIRNAME; Log.i(TAG, "cacheDirPath="+cacheDirPath); //设置数据库缓存路径 mWebView.getSettings().setDatabasePath(cacheDirPath); //设置  Application Caches 缓存目录 mWebView.getSettings().setAppCachePath(cacheDirPath); //开启 Application Caches 功能 mWebView.getSettings().setAppCacheEnabled(true); }

清除缓存

  public void clearWebViewCache(){ //清理Webview缓存数据库 try { deleteDatabase("webview.db");  deleteDatabase("webviewCache.db"); } catch (Exception e) { e.printStackTrace(); } //WebView 缓存文件 File appCacheDir = new File(getFilesDir().getAbsolutePath()+APP_CACAHE_DIRNAME); Log.e(TAG, "appCacheDir path="+appCacheDir.getAbsolutePath()); File webviewCacheDir = new File(getCacheDir().getAbsolutePath()+"/webviewCache"); Log.e(TAG, "webviewCacheDir path="+webviewCacheDir.getAbsolutePath()); //删除webview 缓存目录 if(webviewCacheDir.exists()){ deleteFile(webviewCacheDir); } //删除webview 缓存 缓存目录 if(appCacheDir.exists()){ deleteFile(appCacheDir); } }

完整代码

public class MainActivity extends Activity { private static final String TAG = MainActivity.class.getSimpleName(); private static final String APP_CACAHE_DIRNAME = "/webcache"; private TextView tv_topbar_title; private RelativeLayout rl_loading; private WebView mWebView; private String url; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //url:http://m.dianhua.cn/detail/31ccb426119d3c9eaa794df686c58636121d38bc?apikey=jFaWGVHdFVhekZYWTBWV1ZHSkZOVlJWY&app=com.yulore.yellowsdk_ios&uid=355136051337627 url = "http://m.dianhua.cn/detail/31ccb426119d3c9eaa794df686c58636121d38bc?apikey=jFaWGVHdFVhekZYWTBWV1ZHSkZOVlJWY&app=com.yulore.yellowsdk_ios&uid=355136051337627"; findView(); } private void findView() { tv_topbar_title = (TextView) findViewById(R.id.tv_topbar_title); rl_loading = (RelativeLayout) findViewById(R.id.rl_loading); mWebView = (WebView) findViewById(R.id.mWebView); initWebView(); mWebView.setWebViewClient(new WebViewClient() { @Override public void onLoadResource(WebView view, String url) { Log.i(TAG, "onLoadResource url="+url); super.onLoadResource(view, url); } @Override public boolean shouldOverrideUrlLoading(WebView webview, String url) { Log.i(TAG, "intercept url="+url); webview.loadUrl(url); return true; } @Override public void onPageStarted(WebView view, String url, Bitmap favicon) { Log.e(TAG, "onPageStarted"); rl_loading.setVisibility(View.VISIBLE); // 显示加载界面 } @Override public void onPageFinished(WebView view, String url) { String title = view.getTitle(); Log.e(TAG, "onPageFinished WebView title=" + title); tv_topbar_title.setText(title); tv_topbar_title.setVisibility(View.VISIBLE); rl_loading.setVisibility(View.GONE); // 隐藏加载界面 } @Override public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) { rl_loading.setVisibility(View.GONE); // 隐藏加载界面 Toast.makeText(getApplicationContext(), "", Toast.LENGTH_LONG).show(); } }); mWebView.setWebChromeClient(new WebChromeClient() { @Override public boolean onJsAlert(WebView view, String url, String message, JsResult result) { Log.e(TAG, "onJsAlert " + message); Toast.makeText(getApplicationContext(), message, Toast.LENGTH_SHORT).show(); result.confirm(); return true; } @Override public boolean onJsConfirm(WebView view, String url, String message, JsResult result) { Log.e(TAG, "onJsConfirm " + message); return super.onJsConfirm(view, url, message, result); } @Override public boolean onJsPrompt(WebView view, String url, String message, String defaultValue, JsPromptResult result) { Log.e(TAG, "onJsPrompt " + url); return super.onJsPrompt(view, url, message, defaultValue, result); } }); mWebView.loadUrl(url); } private void initWebView() { mWebView.getSettings().setJavaScriptEnabled(true); mWebView.getSettings().setRenderPriority(RenderPriority.HIGH); mWebView.getSettings().setCacheMode(WebSettings.LOAD_DEFAULT);  //设置 缓存模式 // 开启 DOM storage API 功能 mWebView.getSettings().setDomStorageEnabled(true); //开启 database storage API 功能 mWebView.getSettings().setDatabaseEnabled(true);  String cacheDirPath = getFilesDir().getAbsolutePath()+APP_CACAHE_DIRNAME;
//      String cacheDirPath = getCacheDir().getAbsolutePath()+Constant.APP_DB_DIRNAME; Log.i(TAG, "cacheDirPath="+cacheDirPath); //设置数据库缓存路径 mWebView.getSettings().setDatabasePath(cacheDirPath); //设置  Application Caches 缓存目录 mWebView.getSettings().setAppCachePath(cacheDirPath); //开启 Application Caches 功能 mWebView.getSettings().setAppCacheEnabled(true); } /*** 清除WebView缓存*/ public void clearWebViewCache(){ //清理Webview缓存数据库 try { deleteDatabase("webview.db");  deleteDatabase("webviewCache.db"); } catch (Exception e) { e.printStackTrace(); } //WebView 缓存文件 File appCacheDir = new File(getFilesDir().getAbsolutePath()+APP_CACAHE_DIRNAME); Log.e(TAG, "appCacheDir path="+appCacheDir.getAbsolutePath()); File webviewCacheDir = new File(getCacheDir().getAbsolutePath()+"/webviewCache"); Log.e(TAG, "webviewCacheDir path="+webviewCacheDir.getAbsolutePath()); //删除webview 缓存目录 if(webviewCacheDir.exists()){ deleteFile(webviewCacheDir); } //删除webview 缓存 缓存目录 if(appCacheDir.exists()){ deleteFile(appCacheDir); } } /*** 递归删除 文件/文件夹* * @param file*/ public void deleteFile(File file) { Log.i(TAG, "delete file path=" + file.getAbsolutePath()); if (file.exists()) { if (file.isFile()) { file.delete(); } else if (file.isDirectory()) { File files[] = file.listFiles(); for (int i = 0; i < files.length; i++) { deleteFile(files[i]); } } file.delete(); } else { Log.e(TAG, "delete file no exists " + file.getAbsolutePath()); } } }

android WebView清除缓存相关推荐

  1. Android WebView清除缓存,总有一个方法适合你

    一,缓存介绍 缓存分为:页面缓存和数据缓存 页面缓存: 指加载一个网页时的html.JS.CSS等页面或者资源数据. 数据缓存 : 数据缓存分为AppCache和DOM Storage两种. 一般清除 ...

  2. android webview清理缓存

    android webview清理缓存 最近写了个Android项目 遇到了一个问题就是webview 的缓存问题 每次进入程序webview都用缓存.接下来说说这问题是如何解决的. 首先了解下缓存的 ...

  3. android内核网络缓存,Android WebView cache 缓存 腾讯X5内核在线视频播放

    [实例简介] Android WebView cache 缓存 腾讯X5内核在线视频播放 [实例截图] [核心代码] Terry007 └── Terry007 ├── AndroidManifest ...

  4. android清除缓存 代码,Android应用开发之Android应用清除缓存一般清理目录和代码的教程...

    本文将带你了解Android应用开发Android应用清除缓存一般清理目录和代码的教程,希望本文对大家学Android有所帮助. 一个应用安装完成,会有缓存,缓存一般分为内部存储的和外置的,内存中路径 ...

  5. 安卓使用WebView清除缓存

    Android 清除WebView缓存 最近项目中需要用WebView显示内容,需要使用JavaScript去交互,但是每次加载都加载到了缓存的数据,这里记录一下如何去清除WebView缓存. 首先要 ...

  6. WebView清除缓存的有效方法

    <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=&quo ...

  7. Android studio 清除缓存数据的步骤

    导读:在eclipse的当中进行运行Android的运用的程序的时候,就会产生内存缓存的信息,而eclipse是可以直接点击停止运行程序,然后点击清除缓存,就可以解决了这个问题,而Android st ...

  8. android webView的缓存机制和资源预加载

    android 原生使用WebView嵌入H5页面 Hybrid开发 一.性能问题 android webview 里H5加载速度慢 网络流量大 1.H5页面加载速度慢 渲染速度慢 js解析效率 js ...

  9. android 显示清除缓存

    工具类 package com.infzm.daily.know.utils; /* * 文 件 名: DataCleanManager.java * * 描 述: 主要功能有清除内/外缓存,清除数据 ...

最新文章

  1. 覆盖半透明黑色CSS,通常用于弹窗提示、弹窗显示大图等情况的背景图层
  2. 【SpringCloud】高可用Eureka
  3. LeetCode Linked List Random Node(蓄水池采样算法)
  4. wxWidgets随笔(11)-wxFrame类
  5. 【已解决】Linux redhat 6.4上安装VNC Server
  6. wepy 项目的初始化应用
  7. [Java基础]自动装箱和拆箱
  8. 导出mysql excel数据字典_mysql导出 Excel数据字典(全)
  9. java基础教程哪个好,吐血整理
  10. 关于feign开启hystrix导致用户鉴权失败
  11. 阿里云数据中台训练营第一期圆满落幕
  12. “我爱淘”第二冲刺阶段Scrum站立会议4
  13. VC输出调用出错信息
  14. 坦克大战(Python)附思维导图、代码、图片音频资源
  15. ADI官方提供的源码AD9361+ZC706 利用TCL构建Vivado工程,利用no-OS-master搭建SDK工程
  16. 读取ClientKey的另一种思路,无需注入DLL
  17. SequelizeAccessDeniedError的原因和解决方式
  18. c语言源程序自动评判系统,C语言源程序的自动评判系统.pdf
  19. dz邮箱验证怎么设置_如何设置discuz qq邮箱验证
  20. 干货!学霸用12个决策模型告诉你,如何判断你到底需不需要区块链!

热门文章

  1. Android应用在国外之各种广告集成(Vungle,AppLovin,Google,Facebook)
  2. 上海地铁和北京地铁_地铁介绍
  3. es - elasticsearch - aggs - metrics - extended_stats
  4. 开发人员的需求与零代码解决方案
  5. 【图的着色问题】算法设计与分析实验1
  6. 【CSS练习】IT修真院--练习1-九宫格
  7. 山东计算机网络期末试题,山东轻工业学院计算机网络期末试题A(13页)-原创力文档...
  8. 差分隐私理论入门科普
  9. 做好软件测试需要具备的思维方式
  10. 台式计算机显示连接不可用,电脑莫名其妙无法上网提示“连接不可用”如何解决...