android webview的缓存机制

来源:互联网 发布:linux下安装redmine 编辑:程序博客网 时间:2024/06/05 03:06

在运行安卓程序时,报错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”);


0 0
原创粉丝点击