在運行安卓程序時,報錯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
2
讓我們看一下如何將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”);