WebView Cache 緩存清除

當咱們加載Html時候,會在咱們data/應用package下生成database與cache兩個文件夾:
咱們請求的Url記錄是保存在webviewCache.db裏,而url的內容是保存在webviewCache文件夾下.
WebView中存在着兩種緩存:網頁數據緩存(存儲打開過的頁面及資源)、H5緩存(即AppCache)。
css


1、網頁緩存html

一、緩存構成
/data/data/package_name/cache/
/data/data/package_name/database/webview.db
java

/data/data/package_name/database/webviewCache.dbandroid


WebView緩存文件結構以下圖所示ios





再看一下 webviewCache 數據庫結構web





綜合能夠得知 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。
api


設置WebView 緩存模式緩存

 

  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.     }  



清除緩存網絡

 

  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.     }  


完整代碼

 

  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");  
相關文章
相關標籤/搜索