Android中清楚Cookie和WebView的快取

yangxi_001發表於2015-03-12

前幾天在做facebook連結的時候,總是第一次成功,第二次失敗,後來分析,是本地的快取沒有清空,看了facebook sdk的原始碼才發現,果然,要做一步清楚cookie的操作:

一、清除cookie

 public static void clearCookies(Context context) {
        // Edge case: an illegal state exception is thrown if an instance of
        // CookieSyncManager has not be created.  CookieSyncManager is normally
        // created by a WebKit view, but this might happen if you start the
        // app, restore saved state, and click logout before running a UI
        // dialog in a WebView -- in which case the app crashes
        @SuppressWarnings("unused")
        CookieSyncManager cookieSyncMngr =
            CookieSyncManager.createInstance(context);
        CookieManager cookieManager = CookieManager.getInstance();
        cookieManager.removeAllCookie();
    }

這是facebook sdk的原始碼,我不知道第一句到底起了什麼作用?

 

二、清除webview快取,檢視root過的手機data下的檔案,會發現有這個東西:webview命名的東西

 

刪除儲存於手機上的快取.

 

[html] view plaincopy
  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. }     


 

 

開啟關閉使用快取

[java] view plaincopy
  1. //優先使用快取:  
  2. WebView.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);    
  3.   
  4. //不使用快取:  
  5. WebView.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE);   


 

 

在退出應用的時候加上如下程式碼

[html] view plaincopy
  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");   


 

 

 發現這個問題,一個朋友在iteye上問的:

Android的CookieManager只提供了removeAllCookies方法,用來刪除所有的cookie,有什麼辦法只刪除和特定url關聯的cookie呢?本來打算使用setCookie(url, value)將指定url關聯的cookie設為空串,但試了一下發現這個方法只是在已有的基礎上繼續新增cookie,並不能重置已有的cookie。

有朋友給打答案:

[html] view plaincopy
  1. /**  
  2.  * 同步一下cookie  
  3.  */  
  4. public static void synCookies(Context context, String url) {  
  5.     CookieSyncManager.createInstance(context);  
  6.     CookieManager cookieManager = CookieManager.getInstance();  
  7.     cookieManager.setAcceptCookie(true);  
  8.     cookieManager.removeSessionCookie();//移除  
  9.     cookieManager.setCookie(url, cookies);//指定要修改的cookies  
  10.     CookieSyncManager.getInstance().sync();  
  11. }  

相關文章