溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

WebView加載優(yōu)化的方式

發(fā)布時間:2020-10-27 10:30:51 來源:億速云 閱讀:134 作者:小新 欄目:編程語言

這篇文章給大家分享的是有關WebView加載優(yōu)化的方式的內(nèi)容。小編覺得挺實用的,因此分享給大家做個參考。一起跟隨小編過來看看吧。

WebView加載優(yōu)化

當WebView的使用頻率變得頻繁的時候,對于其各方面的優(yōu)化就變得逐漸重要了起來??梢灾赖氖?,我們每加載一個 H5頁面,都會有很多的請求。除了HTML主URL自身的請求外,HTML外部引用的 JS、CSS、字體文件、圖片都是一個個獨立的HTTP 請求,雖然請求是并發(fā)的,但當網(wǎng)頁整體數(shù)量達到一定程度的時候,再加上瀏覽器解析、渲染的時間,Web整體的加載時間變得很長。同時請求文件越多,消耗的流量也會越多。那么對于加載的優(yōu)化就變得非常重要,這方面的經(jīng)驗我也沒有什么別的,大概三個方面:
一個,就是資源本地化的問題
首先可以明確的是,以目前的網(wǎng)絡條件,通過網(wǎng)絡去服務器獲取資源的速度是遠遠比不上從本地讀取的。談論各種優(yōu)化策略其實恰恰忽略了“需要加載”才是阻擋速度提升的最大絆腳石。所以我們的思路一,就是將一些較重的資源比如js、css、圖片甚至HTML本身進行本地化處理,在每次加載到這些資源的時候,從本地讀取進行加載,可以簡單記憶為“存·取·更”。
1.“存”——將上述重量級資源打包進apk文件,每次加載相應文件時時從本地取即可。也可不打包,在第一次加載時以及接下來的若干間隔時間里動態(tài)下載存儲,將所有的資源文件都存在Android的asset目錄下;
2.“取”——重寫WebViewClient的WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request)方法,通過一定的判別方法(例如正則表達式)攔截相應的請求,從本地讀取相應資源并返回;
3.“更”——建立起Cache Control機制,定期或使用API通知的形式控制本地資源的更新,保證本地資源是最新和可用的。
第二個,就是緩存的問題
倘若你不采用或不完全采用第一條資源本地化的思路,那么你的WebView緩存是必須要開啟的(雖然這一思路和第一條有重合的地方)。

WebSettings settings = webView.getSettings(); 
settings.setAppCacheEnabled(true); 
settings.setDatabaseEnabled(true); 
settings.setDomStorageEnabled(true);//開啟DOM緩存 
settings.setCacheMode(WebSettings.LOAD_DEFAULT);

在網(wǎng)絡正常時,采用默認緩存策略,在緩存可獲取并且沒有過期的情況下加載緩存,否則通過網(wǎng)絡獲取資源以減少頁面的網(wǎng)絡請求次數(shù)。
這里值得提起的是,我們經(jīng)常在app里用WebView展示頁面時,并不想讓用戶覺得他是在訪問一個網(wǎng)頁。因為倘若我們的app里網(wǎng)頁非常多,而我們給用戶的感覺又都像在訪問網(wǎng)頁的話,我們的app便失去了意義。(我的意思是為什么用戶不直接使用瀏覽器呢?)
所以這時,離線緩存的問題就值得我們注意。我們需要讓用戶在沒有網(wǎng)的時候,依然能夠操作我們的app,而不是面對一個和瀏覽器里的網(wǎng)絡錯誤一樣的頁面,哪怕他能進行的操作十分有限。
這里我的思路是,在開啟緩存的前提下,WebView在加載頁面時檢測網(wǎng)絡變化,倘若在加載頁面時用戶的網(wǎng)絡突然斷掉,我們應當更改WebView的緩存策略。

ConnectivityManager connectivityManager = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE); 
NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo(); 
if(networkInfo.isAvailable()) { 
settings.setCacheMode(WebSettings.LOAD_DEFAULT);//網(wǎng)絡正常時使用默認緩存策略 
} else { 
settings.setCacheMode(WebSettings.LOAD_CACHE_ONLY);//網(wǎng)絡不可用時只使用緩存 
}

既然有緩存,就要有緩存控制,與一相似的是我們也要建立緩存控制機制,定期或接受服務器通知來進行緩存的清空或更新。
第三個,就是延遲加載和執(zhí)行js
在WebView中,onPageFinished()的回調(diào)意味著頁面加載的完成。但該方法會在JavScript腳本執(zhí)行完成后才會觸發(fā),倘若我們要加載的頁面使用了JQuery,會在處理完DOM對象,執(zhí)行完$(document).ready(function() {})后才會渲染并顯示頁面。這是不可接受的,所以我們需要對Js進行延遲加載,當然這部分是Web前端的工作。

感謝各位的閱讀!關于WebView加載優(yōu)化的方式就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,讓大家可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。

AI