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

android webview的缓存机制

2016-09-03 16:46 405 查看
在运行安卓程序时,报错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”);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: