1. 前言
用過WebView的同學都清楚,WebView默認是會自動緩存網頁資源的。雖然前端H5網頁有自己一套緩存機制(不懂的同學,可以看看這篇文章 手把手教你構建 Android WebView 的緩存機制 & 資源預加載方案),但是在某些場景下,還是需要原生主動去做清除緩存操作,即清除WebView的緩存。大多數文章都會說,使用下列的方法就可以清除了。
new WebView(context).clearCache(true);
但實際上是這種清除方式,只是清除了一部分緩存而已。像Cookie,使用這種方式是清除不了的。
2. 解決方案
經過自己的摸索,整理出了一個有效的清除方式,具體代碼如下:
/**
* 清除緩存
*
* @param context 上下文
*/
public static void clearCache(Context context) {
try {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { // 清除cookie
CookieManager.getInstance().removeAllCookies(null);
} else {
CookieSyncManager.createInstance(context);
CookieManager.getInstance().removeAllCookie();
CookieSyncManager.getInstance().sync();
}
new WebView(context).clearCache(true);
File cacheFile = new File(context.getCacheDir().getParent() + "/app_webview");
clearCacheFolder(cacheFile, System.currentTimeMillis());
} catch (Exception e) {
e.printStackTrace();
}
}
private static int clearCacheFolder(File dir, long time) {
int deletedFiles = 0;
if (dir != null && dir.isDirectory()) {
try {
for (File child : dir.listFiles()) {
if (child.isDirectory()) {
deletedFiles += clearCacheFolder(child, time);
}
if (child.lastModified() < time) {
if (child.delete()) {
deletedFiles++;
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
return deletedFiles;
}
3. 驗證
- 調用上面clearCache方法後,可以重新打開網頁,比較網頁加載的速度
- 使用Android Studio的DeviceFileExplorer工具,進入到“/dada/data/APP的包名”目錄下,比較前後文件內容的變化,如下圖所示
完整的demo可以查看 AndroidWebView。
如果想進一步交流和學習的同學,可以加一下QQ羣哦!