您的位置:首页 > 移动开发

android webview的缓存机制

2014-08-25 16:04 302 查看
在运行安卓程序时,报错DatabaseObjectNotClosedException

运行是/data/data/package/databases/webview.db没关掉db

大概是跟webview的缓存有关?cache还是cookie?

于是研究了一下webview的缓存

webview缓存策略:

//优先使用缓存:
WebView.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);  
 
//不使用缓存:
WebView.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE);

缓存策略为,判断是否有网络,有的话,使用LOAD_DEFAULT,无网络时,使用LOAD_CACHE_ELSE_NETWORK


让我们看一下如何将Cookie和WebView进行结合:
Cooki的获取:

1
2
CookieManager cm = CookieManager.getInstance();
String Cookiestr = cm.getCookie(url);
Cookie的同步:

CookieSyncManager.createInstance(this);
CookieSyncManager.getInstance().sync();
注意,此处代码需在在webview加载URL前设置,并且在调用后,不再设置webview的websetttings属性,否则会导致失效.

一般通过HttpClient,获取服务器的Cookie后再进行设置(比如一些登录的用户信息或者状态信息):

List<cookie> cookies = httpclient.getCookieStore().getCookies();  
3、清除缓存
clearCache(boolean)
CacheManager.clear高版本中需要调用隐藏API。

清除Cookie:

1
CookieManager.getInstance().removeSessionCookie();

1
CookieManager.getInstance().removeAllCookies();
如果只是需要删除和特定url关联的cookie,需要先进行移除后同步:
1
2
3
4
5
6
7
8
9
10
11
/**
 * 同步一下cookie
 */
public static void
synCookies(Context context, String url) {
    CookieSyncManager.createInstance(context);
    CookieManager cookieManager = CookieManager.getInstance();
    cookieManager.setAcceptCookie(true);
    cookieManager.removeSessionCookie();//移除
    cookieManager.setCookie(url, cookies);//指定要修改的cookies
    CookieSyncManager.getInstance().sync();
}

二、H5缓存

1、缓存构成
根据setAppCachePath(String appCachePath)提供的路径,在H5使用缓存过程中生成的缓存文件。

2、缓存模式
无模式选择,通过setAppCacheEnabled(boolean flag)设置是否打开。默认关闭,即,H5的缓存无法使用。

3、清除缓存
找到调用setAppCachePath(String appCachePath)设置缓存的路径,把它下面的文件全部删除就OK了。

4删除缓存
// clear the cache before time numDays    
private int clearCacheFolder(File dir, long
numDays) {         
    int deletedFiles = 0;        
    if (dir!= null
&& dir.isDirectory()) {            
        try {               
            for (File child:dir.listFiles()) {   
                if (child.isDirectory()) {             
                    deletedFiles += clearCacheFolder(child, numDays);         
                }   
                if (child.lastModified() < numDays) {    
                    if (child.delete()) {                  
                        deletedFiles++;          
                    }   
                }   
            }            
        } catch(Exception e) {      
            e.printStackTrace();   
        }    
    }      
    return deletedFiles;    
}

6 退出应用的时候 :
File file = CacheManager.getCacheFileBaseDir();  
   if (file != null && file.exists() && file.isDirectory()) {  
    for (File item : file.listFiles()) {  
     item.delete();  
    }  
    file.delete();  
   }  
   
  context.deleteDatabase("webview.db");  
  context.deleteDatabase("webviewCache.db”);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  webview 缓存机制