android webview的緩存機制

在運行安卓程序時,報錯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”);





發佈了118 篇原創文章 · 獲贊 2 · 訪問量 17萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章