玩轉 WebView ,突破系統限制,讓快取更簡單,更靈活
阿新 • • 發佈:2022-04-28
今天給大家推薦一個不錯的開源庫,非常的不錯,可以突破系統限制,讓快取更簡單,更靈活。它就是:CacheWebView。
CacheWebView
CacheWebView 是 Android WebView 快取的自定義實現,通過攔截靜態資源進行記憶體 (LRU) 和磁碟 (LRU)2 級快取實現快取。突破系統 WebView 快取的空間限制,讓快取更簡單、更快、更靈活。讓網站離線也能正常訪問。
流程圖
使用方式
引入庫
compile 'ren.yale.android:cachewebviewlib:1.2.3'
修改程式碼
程式碼裡將WebView
改為CacheWebView
WebView
為ren.yale.android.cachewebviewlib.CacheWebView
完畢,其他都不用修改。CacheWebView 預設會有內部 cache200M 磁碟快取空間,20M 記憶體快取空間。同時快取模式是 http 預設的快取模式
進階
- 修改快取路徑和大小, 最好在 Application 中初始化,初始化沒有耗時操作
File cacheFile = new File(this.getCacheDir(),"cache_path_name"); CacheWebView.getCacheConfig().init(this,cacheFile.getAbsolutePath(),1024*1024*100,1024*1024*10) .enableDebug(true);//100M 磁碟快取空間,10M 記憶體快取空間
- 預載入,為了訪問更快,可以將常用的頁面預載入
CacheWebView.cacheWebView(this).loadUrl(URL);//要放在UI執行緒
或者
CacheWebView.servicePreload(this,URL);//通過啟動Service來預載入,不影響UI執行緒
- 強制快取,預設是普通快取,和 http 快取模式一樣。setCacheStrategy(WebViewCache.CacheStrategy.FORCE), 這樣對於靜態資源直接走快取,不需要和伺服器溝通走 304 快取,這樣會更快;如果靜態資源要更新, 請讓 web 前端同學修改靜態資源連結,如給連結加 md5 值,或者加版本等等方式;
CacheWebView webview;
webview.setCacheStrategy(WebViewCache.CacheStrategy.FORCE);
- 靜態資源字尾對映 預設磁碟快取靜態資源字尾有:html,htm,js,ico,css,png,jpg,jpeg,gif,bmp,ttf,woff,woff2,otf,eot,svg,xml,swf,txt,text,conf 可以新增刪除, addExtension,removeExtension 預設記憶體快取靜態資源字尾有:html,htm,js,css,xml,txt,text,conf 可以新增刪除, addRamExtension,removeRamExtension
webview.getWebViewCache().getStaticRes().addExtension("swf").removeExtension("svg")
.addRamExtension("png").removeRamExtension("html");
- 設定快取攔截器,可以針對每一個 url 是否攔截快取
webview.setCacheInterceptor(new CacheInterceptor() {
public boolean canCache(String url) {
return true;
}
});
- 刪除快取
CacheWebView webview;
webview.clearCache();
- 新增 header
CacheWebView webview;
webview.loadUrl(URL,getHeaderMap(URL));
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
CacheWebView v = (CacheWebView) view;
v.loadUrl(url,getHeaderMap(url));
return true;
}
- 阻塞圖片載入,讓頁面更快載入 預設沒有阻塞圖片載入,setBlockNetworkImage(true) 後。在頁面 onPageStarted 時阻塞圖片載入,onPageFinished 時開啟圖片載入
CacheWebView webview;
webview.setBlockNetworkImage(true);
- 是否使用自定義快取,預設是自定義快取, 如果是 false,那就和正常的 WebView 使用一樣
CacheWebView webview;
webview.setEnableCache(true);
- 設定 User-Agent
CacheWebView webview;
webview.setUserAgent("Android");
- 獲取快取檔案
CacheStatus cacheStatus = webview.getWebViewCache().getCacheFile(URL);
if (cacheStatus.isExist()){
File file = cacheStatus.getCacheFile();
String extension = cacheStatus.getExtension();
}
- destroy
CacheWebView webview;
webview.destroy();
- 頁面亂碼;預設判斷頁面編碼的 buffer 大小是 500,如果有些中文網站亂碼,可以把這個 size 設定大些
CacheWebView.getCacheConfig().setEncodeBufferSize(1024);