当我们加载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缓存文件结构如下图所示

 

WebView Cache 缓存清除_缓存

 

 

再看一下 webviewCache 数据库结构

 

WebView Cache 缓存清除_android_02

 

 

综合可以得知 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 缓存模式

 

[java] view plain copy  
  1. private void initWebView() {  
  2.           
  3.         mWebView.getSettings().setJavaScriptEnabled(true);  
  4.         mWebView.getSettings().setRenderPriority(RenderPriority.HIGH);  
  5.         mWebView.getSettings().setCacheMode(WebSettings.LOAD_DEFAULT);  //设置 缓存模式  
  6.         // 开启 DOM storage API 功能  
  7.         mWebView.getSettings().setDomStorageEnabled(true);  
  8.         //开启 database storage API 功能  
  9.         mWebView.getSettings().setDatabaseEnabled(true);   
  10.         String cacheDirPath = getFilesDir().getAbsolutePath()+APP_CACAHE_DIRNAME;  
  11. //      String cacheDirPath = getCacheDir().getAbsolutePath()+Constant.APP_DB_DIRNAME;  
  12.         Log.i(TAG, "cacheDirPath="+cacheDirPath);  
  13.         //设置数据库缓存路径  
  14.         mWebView.getSettings().setDatabasePath(cacheDirPath);  
  15.         //设置  Application Caches 缓存目录  
  16.         mWebView.getSettings().setAppCachePath(cacheDirPath);  
  17.         //开启 Application Caches 功能  
  18.         mWebView.getSettings().setAppCacheEnabled(true);  
  19.     }  

 

 

清除缓存

 

[java] view plain copy  
  1. /** 
  2.      * 清除WebView缓存 
  3.      */  
  4.     public void clearWebViewCache(){  
  5.           
  6.         //清理Webview缓存数据库  
  7.         try {  
  8.             deleteDatabase("webview.db");   
  9.             deleteDatabase("webviewCache.db");  
  10.         } catch (Exception e) {  
  11.             e.printStackTrace();  
  12.         }  
  13.           
  14.         //WebView 缓存文件  
  15.         File appCacheDir = new File(getFilesDir().getAbsolutePath()+APP_CACAHE_DIRNAME);  
  16.         Log.e(TAG, "appCacheDir path="+appCacheDir.getAbsolutePath());  
  17.           
  18.         File webviewCacheDir = new File(getCacheDir().getAbsolutePath()+"/webviewCache");  
  19.         Log.e(TAG, "webviewCacheDir path="+webviewCacheDir.getAbsolutePath());  
  20.           
  21.         //删除webview 缓存目录  
  22.         if(webviewCacheDir.exists()){  
  23.             deleteFile(webviewCacheDir);  
  24.         }  
  25.         //删除webview 缓存 缓存目录  
  26.         if(appCacheDir.exists()){  
  27.             deleteFile(appCacheDir);  
  28.         }  
  29.     }  

 

完整代码

 

[java] view plain copy  
  1. package com.example.webviewtest;  
  2.   
  3. import java.io.File;  
  4.   
  5. import android.app.Activity;  
  6. import android.graphics.Bitmap;  
  7. import android.os.Bundle;  
  8. import android.util.Log;  
  9. import android.view.View;  
  10. import android.webkit.JsPromptResult;  
  11. import android.webkit.JsResult;  
  12. import android.webkit.WebChromeClient;  
  13. import android.webkit.WebSettings;  
  14. import android.webkit.WebSettings.RenderPriority;  
  15. import android.webkit.WebView;  
  16. import android.webkit.WebViewClient;  
  17. import android.widget.RelativeLayout;  
  18. import android.widget.TextView;  
  19. import android.widget.Toast;  
  20.   
  21. public class MainActivity extends Activity {  
  22.   
  23.     private static final String TAG = MainActivity.class.getSimpleName();  
  24.     private static final String APP_CACAHE_DIRNAME = "/webcache";  
  25.     private TextView tv_topbar_title;  
  26.     private RelativeLayout rl_loading;  
  27.     private WebView mWebView;  
  28.     private String url;  
  29.   
  30.     @Override  
  31.     protected void onCreate(Bundle savedInstanceState) {  
  32.         super.onCreate(savedInstanceState);  
  33.         setContentView(R.layout.activity_main);  
  34.           
  35.         //url:http://m.dianhua.cn/detail/31ccb426119d3c9eaa794df686c58636121d38bc?apikey=jFaWGVHdFVhekZYWTBWV1ZHSkZOVlJWY&app=com.yulore.yellowsdk_ios&uid=355136051337627  
  36.         url = "http://m.dianhua.cn/detail/31ccb426119d3c9eaa794df686c58636121d38bc?apikey=jFaWGVHdFVhekZYWTBWV1ZHSkZOVlJWY&app=com.yulore.yellowsdk_ios&uid=355136051337627";  
  37.         findView();  
  38.     }  
  39.   
  40.     private void findView() {  
  41.           
  42.         tv_topbar_title = (TextView) findViewById(R.id.tv_topbar_title);  
  43.           
  44.         rl_loading = (RelativeLayout) findViewById(R.id.rl_loading);  
  45.           
  46.         mWebView = (WebView) findViewById(R.id.mWebView);  
  47.           
  48.         initWebView();  
  49.           
  50.         mWebView.setWebViewClient(new WebViewClient() {  
  51.   
  52.             @Override  
  53.             public void onLoadResource(WebView view, String url) {  
  54.                   
  55.                 Log.i(TAG, "onLoadResource url="+url);  
  56.                   
  57.                 super.onLoadResource(view, url);  
  58.             }  
  59.   
  60.             @Override  
  61.             public boolean shouldOverrideUrlLoading(WebView webview, String url) {  
  62.   
  63.                 Log.i(TAG, "intercept url="+url);  
  64.                   
  65.                 webview.loadUrl(url);  
  66.   
  67.                 return true;  
  68.             }  
  69.   
  70.             @Override  
  71.             public void onPageStarted(WebView view, String url, Bitmap favicon) {  
  72.                   
  73.                 Log.e(TAG, "onPageStarted");  
  74.                   
  75.                 rl_loading.setVisibility(View.VISIBLE); // 显示加载界面  
  76.             }  
  77.   
  78.             @Override  
  79.             public void onPageFinished(WebView view, String url) {  
  80.   
  81.                 String title = view.getTitle();  
  82.   
  83.                 Log.e(TAG, "onPageFinished WebView title=" + title);  
  84.   
  85.                 tv_topbar_title.setText(title);  
  86.                 tv_topbar_title.setVisibility(View.VISIBLE);  
  87.   
  88.                 rl_loading.setVisibility(View.GONE); // 隐藏加载界面  
  89.             }  
  90.   
  91.             @Override  
  92.             public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {  
  93.   
  94.                 rl_loading.setVisibility(View.GONE); // 隐藏加载界面  
  95.   
  96.                 Toast.makeText(getApplicationContext(), "",  
  97.                         Toast.LENGTH_LONG).show();  
  98.             }  
  99.         });  
  100.   
  101.         mWebView.setWebChromeClient(new WebChromeClient() {  
  102.   
  103.             @Override  
  104.             public boolean onJsAlert(WebView view, String url, String message, JsResult result) {  
  105.   
  106.                 Log.e(TAG, "onJsAlert " + message);  
  107.   
  108.                 Toast.makeText(getApplicationContext(), message, Toast.LENGTH_SHORT).show();  
  109.   
  110.                 result.confirm();  
  111.   
  112.                 return true;  
  113.             }  
  114.   
  115.             @Override  
  116.             public boolean onJsConfirm(WebView view, String url, String message, JsResult result) {  
  117.   
  118.                 Log.e(TAG, "onJsConfirm " + message);  
  119.   
  120.                 return super.onJsConfirm(view, url, message, result);  
  121.             }  
  122.   
  123.             @Override  
  124.             public boolean onJsPrompt(WebView view, String url, String message, String defaultValue, JsPromptResult result) {  
  125.   
  126.                 Log.e(TAG, "onJsPrompt " + url);  
  127.   
  128.                 return super.onJsPrompt(view, url, message, defaultValue, result);  
  129.             }  
  130.         });  
  131.           
  132.         mWebView.loadUrl(url);  
  133.     }  
  134.   
  135.     private void initWebView() {  
  136.           
  137.         mWebView.getSettings().setJavaScriptEnabled(true);  
  138.         mWebView.getSettings().setRenderPriority(RenderPriority.HIGH);  
  139.         mWebView.getSettings().setCacheMode(WebSettings.LOAD_DEFAULT);  //设置 缓存模式  
  140.         // 开启 DOM storage API 功能  
  141.         mWebView.getSettings().setDomStorageEnabled(true);  
  142.         //开启 database storage API 功能  
  143.         mWebView.getSettings().setDatabaseEnabled(true);   
  144.         String cacheDirPath = getFilesDir().getAbsolutePath()+APP_CACAHE_DIRNAME;  
  145. //      String cacheDirPath = getCacheDir().getAbsolutePath()+Constant.APP_DB_DIRNAME;  
  146.         Log.i(TAG, "cacheDirPath="+cacheDirPath);  
  147.         //设置数据库缓存路径  
  148.         mWebView.getSettings().setDatabasePath(cacheDirPath);  
  149.         //设置  Application Caches 缓存目录  
  150.         mWebView.getSettings().setAppCachePath(cacheDirPath);  
  151.         //开启 Application Caches 功能  
  152.         mWebView.getSettings().setAppCacheEnabled(true);  
  153.     }  
  154.       
  155.     /** 
  156.      * 清除WebView缓存 
  157.      */  
  158.     public void clearWebViewCache(){  
  159.           
  160.         //清理Webview缓存数据库  
  161.         try {  
  162.             deleteDatabase("webview.db");   
  163.             deleteDatabase("webviewCache.db");  
  164.         } catch (Exception e) {  
  165.             e.printStackTrace();  
  166.         }  
  167.           
  168.         //WebView 缓存文件  
  169.         File appCacheDir = new File(getFilesDir().getAbsolutePath()+APP_CACAHE_DIRNAME);  
  170.         Log.e(TAG, "appCacheDir path="+appCacheDir.getAbsolutePath());  
  171.           
  172.         File webviewCacheDir = new File(getCacheDir().getAbsolutePath()+"/webviewCache");  
  173.         Log.e(TAG, "webviewCacheDir path="+webviewCacheDir.getAbsolutePath());  
  174.           
  175.         //删除webview 缓存目录  
  176.         if(webviewCacheDir.exists()){  
  177.             deleteFile(webviewCacheDir);  
  178.         }  
  179.         //删除webview 缓存 缓存目录  
  180.         if(appCacheDir.exists()){  
  181.             deleteFile(appCacheDir);  
  182.         }  
  183.     }  
  184.       
  185.     /** 
  186.      * 递归删除 文件/文件夹 
  187.      *  
  188.      * @param file 
  189.      */  
  190.     public void deleteFile(File file) {  
  191.   
  192.         Log.i(TAG, "delete file path=" + file.getAbsolutePath());  
  193.           
  194.         if (file.exists()) {  
  195.             if (file.isFile()) {  
  196.                 file.delete();  
  197.             } else if (file.isDirectory()) {  
  198.                 File files[] = file.listFiles();  
  199.                 for (int i = 0; i < files.length; i++) {  
  200.                     deleteFile(files[i]);  
  201.                 }  
  202.             }  
  203.             file.delete();  
  204.         } else {  
  205.             Log.e(TAG, "delete file no exists " + file.getAbsolutePath());  
  206.         }  
  207.     }  
  208.   

 

简洁版代码:

 

  1. System.out.println("getCacheDir: "+WebViewActivity.this.getCacheDir());  
  2.     System.out.println("PackageResourcePath(): "+WebViewActivity.this.getPackageCodePath());  
  3.     System.out.println("getCacheDir: "+WebViewActivity.this.getPackageResourcePath());  
  4.     System.out.println("FilesDir: "+WebViewActivity.this.getDatabasePath("webview.db").getPath());  
  5.     System.out.println("FilesDir: "+WebViewActivity.this.getFilesDir().getPath())  
  1.    
  1. 03-31 11:54:52.094: I/System.out(22224): getCacheDir: /data/data/com.liao.webview/cache  
  2. 03-31 11:54:52.094: I/System.out(22224): PackageResourcePath(): /data/app/com.liao.webview-1.apk  
  3. 03-31 11:54:52.115: I/System.out(22224): getCacheDir: /data/app/com.liao.webview-1.apk  
  4. 03-31 11:54:52.115: I/System.out(22224): FilesDir: /data/data/com.liao.webview/databases/webview.db  
  5. 03-31 11:54:52.154: I/System.out(22224): FilesDir: /data/data/com.liao.webview/files  
  6. 03-31 11:54:52.265: I/ActivityManager(59): Displayed activity com.liao.webview/.WebViewActivity: 418 ms (total 418 ms)  
  1.    
  1. // clear the cache before time numDays       
  2. private int clearCacheFolder(File dir, long numDays) {            
  3.     int deletedFiles = 0;           
  4.     if (dir!= null && dir.isDirectory()) {               
  5.         try {                  
  6.             for (File child:dir.listFiles()) {      
  7.                 if (child.isDirectory()) {                
  8.                     deletedFiles += clearCacheFolder(child, numDays);            
  9.                 }      
  10.                 if (child.lastModified() < numDays) {       
  11.                     if (child.delete()) {                     
  12.                         deletedFiles++;             
  13.                     }      
  14.                 }      
  15.             }               
  16.         } catch(Exception e) {         
  17.             e.printStackTrace();      
  18.         }       
  19.     }         
  20.     return deletedFiles;       
  21. }     
  1. //优先使用缓存:  
  2. WebView.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);    
  1. <p>//不使用缓存:  
  2. WebView.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE); </p>  
  1.    
  1. 退出的时候加上下面代码  
  1. File file = CacheManager.getCacheFileBaseDir();    
  2.    if (file != null && file.exists() && file.isDirectory()) {    
  3.     for (File item : file.listFiles()) {    
  4.      item.delete();    
  5.     }    
  6.     file.delete();    
  7.    }    
  8.     
  9.   context.deleteDatabase("webview.db");    
  10.   context.deleteDatabase("webviewCache.db");