Android webview提升開啟速度方案
前言
為了提高WebView的載入速度,提升使用者體驗,WebView優化方案如下:
思路:
讓WebView開啟時載入本地的檔案,進而縮短網頁中檔案請求的時間,達到提升開啟速度的效果。
實現:
首先從後端下載開啟WebView需要的相關檔案資料包,儲存在本地。之後載入本地的html模版,將css、js檔案利用本地檔案進行攔截替換。載入介面框架完成後,後端呼叫前端的方法獲得介面顯示的資料,顯示網頁內容。
為了方便前後端的方法呼叫,此次採用的方案是利用Dsbridge載入網頁Android/blob/master/readme-chs.md" target="_blank" rel="nofollow,noindex">DSBridge官方文件 。
具體步驟
1.請求後臺獲得要載入的資料包(zip包),下載->解壓->儲存(網上很多關於檔案操作的相關demo)
zip包中包含html檔案、以及html檔案中所有的載入檔案eg:css檔案,js檔案
2.對webview初始化,以及設定需要的Settings屬性
3.注入方法,實現android和js的互動,後端通過呼叫移動端的方法獲得網頁顯示的具體內容
4.獲得本地html地址,載入本地html
5.實施攔截操作
攔截操作有兩種情況:一種是直接返回本地檔案,另一種則是載入url返回載入結果(因為當替換完url後,此方法並不會主動載入url,故需要自己請求載入,最後將返回的資料返回才可以)。
wv_news.setWebViewClient(new WebViewClient() { 省略無用的···· @Override public WebResourceResponse shouldInterceptRequest(WebView view, String url) { //根據版本號更新資料包 String version = PrefUtils.getString(context, "code", ""); File file = null; Uri uri = Uri.parse(url); //abc 自定義的協議名,為方便替換 if (uri.getScheme().equals("abc")) { String picName = url.substring(url.lastIndexOf("/") + 1);//檔名 String suffix = picName.substring(picName.indexOf(".") + 1);//字尾 //path 為根據攔截的資料拼接成的本地檔案地址,利用匹配到的本地檔案替換原始檔中的 file = new File(path); if (!file.exists()) { //保險檔案地址,萬一儲存的檔案出了問題,救急用的 url = getBaseUrl() + suffix + "/" + picName; return getDataWeb(url); } else { FileInputStream fis = null; try { fis = new FileInputStream(file); } catch (FileNotFoundException e) { e.printStackTrace(); } WebResourceResponse response = new WebResourceResponse( MimeTypeMap.getSingleton().getMimeTypeFromExtension(MimeTypeMap.getFileExtensionFromUrl(url)) , "UTF-8", fis); return response; } } return super.shouldInterceptRequest(view, url); } }); } }
載入保險地址的內容返回的資料
public static WebResourceResponse getDataWeb(String newUrl) { HttpURLConnection conn = null;//宣告連線物件 try { URL url = new URL(newUrl); //URL物件 conn = (HttpURLConnection) url.openConnection(); //使用URL開啟一個連結,下面設定這個連線 conn.setRequestMethod("GET"); //使用get請求 if (conn.getResponseCode() == 200) {//返回200表示連線成功 String contentType = conn.getContentType(); if (contentType != null) { String mimeType = contentType; if (contentType.contains(";")) { mimeType = contentType.split(";")[0].trim(); } return new WebResourceResponse(mimeType, conn.getContentEncoding(), conn.getInputStream()); } } } catch (IOException e) { e.printStackTrace(); } return null; }
然後完成操作!
喵印~~~