1. 程式人生 > 其它 >玩轉 WebView ,突破系統限制,讓快取更簡單,更靈活

玩轉 WebView ,突破系統限制,讓快取更簡單,更靈活

今天給大家推薦一個不錯的開源庫,非常的不錯,可以突破系統限制,讓快取更簡單,更靈活。它就是:CacheWebView。

CacheWebView

CacheWebView 是 Android WebView 快取的自定義實現,通過攔截靜態資源進行記憶體 (LRU) 和磁碟 (LRU)2 級快取實現快取。突破系統 WebView 快取的空間限制,讓快取更簡單、更快、更靈活。讓網站離線也能正常訪問。

流程圖

使用方式

引入庫

compile 'ren.yale.android:cachewebviewlib:1.2.3'

修改程式碼

程式碼裡將WebView改為CacheWebView

或者 layout xml 裡修改WebViewren.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);