1.Android WebView效能問題主要原因是:
1.1 H5 頁面載入速度慢
1.1.1 渲染速度慢
前端H5
頁面渲染的速度取決於 兩個方面:
-
Js
解析效率Js
本身的解析過程複雜、解析速度不快 & 前端頁面涉及較多JS
程式碼檔案,所以疊加起來會導致Js
解析效率非常低 - 手機硬體裝置的效能
由於Android
機型碎片化,這導致手機硬體裝置的效能不可控,而大多數的Android手機硬體裝置無法達到很好很好的硬體效能
總結:上述兩個原因 導致 H5頁面的渲染速度慢。
1.1.2 頁面資源載入緩慢
H5
頁面從伺服器獲得,並儲存在 Android
手機記憶體裡:
-
H5
頁面一般會比較多 - 每載入一個
H5
頁面,都會產生較多網路請求:-
HTML
主URL
自身的請求; -
HTML
外部引用的JS、CSS
、字型檔案,圖片也是一個獨立的HTTP
請求
-
每一個請求都序列的,這麼多請求串起來,這導致 H5
頁面資源載入緩慢
總結:H5頁面載入速度慢的原因:渲染速度慢 & 頁面資源載入緩慢 導致 。
1.2 耗費流量
- 每次使用
H5
頁面時,使用者都需要重新載入Android WebView
的H5
頁面 - 每載入一個
H5
頁面,都會產生較多網路請求(上面提到) - 每一個請求都序列的,這麼多請求串起來,這導致消耗的流量也會越多
2. 解決方案
針對上述Android WebView
的效能問題,我提出了兩種解決方案:
(這意味著 H5
網頁 載入過之後會儲存在快取區域,在沒有網路連線時也可以進行訪問)
- 使用
Android WebView
自身的快取機制 - 自身構建快取機制(主要是
H5
頁面資源的預載入)
Android WebView
的快取機制 & 快取模式 :
a. 快取機制:如何將載入過的網頁資料儲存到本地
b. 快取模式:載入網頁時如何讀取之前儲存到本地的網頁快取
前者是儲存,後者是讀取,請注意區別
Android WebView
自帶的快取機制有5種:
1.瀏覽器 快取機制:Android WebView內建自動實現,即不需要設定即實現 2.Application Cache 快取機制
具體實現
// 通過設定WebView的settings來實現
WebSettings settings = getSettings();
String cacheDirPath = context.getFilesDir().getAbsolutePath()+"cache/";
settings.setAppCachePath(cacheDirPath);
// 1. 設定快取路徑
settings.setAppCacheMaxSize(20*1024*1024);
// 2. 設定快取大小
settings.setAppCacheEnabled(true);
// 3. 開啟Application Cache儲存機制
// 特別注意
// 每個 Application 只呼叫一次 WebSettings.setAppCachePath() 和
WebSettings.setAppCacheMaxSize()複製程式碼
作者:Carson_Ho
連結:http://www.jianshu.com/p/5e7075f4875f
來源:簡書
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。
3.Dom Storage 快取機制
a. 原理
DOM Storage
分為 sessionStorage
& localStorage
; 二者使用方法基本相同,區別在於作用範圍不同:b.
sessionStorage
:具備臨時性,即儲存與頁面相關的資料,它在頁面關閉後無法使用c.
localStorage
:具備永續性,即儲存的資料在頁面關閉後也可以使用。d. 具體實現
// 通過設定 `WebView`的`Settings`類實現
WebSettings settings = getSettings();
settings.setDomStorageEnabled(true);
// 開啟DOM storage複製程式碼
4.Web SQL Database 快取機制
具體實現
// 通過設定WebView的settings實現
WebSettings settings = getSettings();
String cacheDirPath = context.getFilesDir().getAbsolutePath()+"cache/";
settings.setDatabasePath(cacheDirPath);
// 設定快取路徑
settings.setDatabaseEnabled(true);
// 開啟 資料庫儲存機制複製程式碼
特別說明
- 根據官方說明,
Web SQL Database
儲存機制不再推薦使用(不再維護) - 取而代之的是
IndexedDB
快取機制,下面會詳細介紹
5.Indexed Database 快取機制 (類似於 Dom Storage 儲存機制
的key-value
儲存方式)
a. 應用場景
儲存 複雜、資料量大的結構化資料
b. 具體實現:
// 通過設定WebView的settings實現
WebSettings settings = getSettings();
settings.setJavaScriptEnabled(true);
// 只需設定支援JS就自動開啟IndexedDB儲存機制
// Android 在4.4開始加入對 IndexedDB 的支援,只需開啟允許 JS 執行的開關就好了。複製程式碼
6.File System 快取機制(H5頁面新加入的快取機制,雖然Android WebView暫時不支援)
小技巧
- 在使用了上述說的
Android WebView
的快取機制後,短時間內再次訪問同一個H5
頁面時,載入速度會比第一次的時間短、更加流暢 - 基於
Android WebView
自身的這些快取機制,有一種小技巧能更好地去減少H5
頁面的載入速度 & 提高效能:在應用啟動時就初始化一個WebView
,事先載入常用H5
頁面資源(載入後就有快取了),後續需要開啟這些H5
頁面時就直接從本地獲取。這種技巧其實是採用了 資源預載入 的思想:提早載入將來需要使用的
H5
頁面(有快取了),使用時直接取過來用,而不用在需要時才去載入 - 具體實現:在
Android
的BaseApplication
就初始化一個WebView
物件用於載入常用的H5
頁面資源;當需要使用這些頁面時再從BaseApplication
裡取過來直接使用- 對於
Android WebView
的首頁建議使用這種方案,能有效提高首頁載入的效率 - 當然這裡的
BaseApplication
只是舉個例子,你也可以選擇在其他地方提前加
- 對於
2.1.2 快取模式
- 定義
快取模式是一種 當載入H5
網頁時 該如何讀取之前儲存到本地快取
從而進行使用 的方式即告訴
Android WebView
什麼時候去讀快取,以哪種方式去讀快取 -
Android WebView
自帶的快取模式有4種:
// 快取模式說明:
// LOAD_CACHE_ONLY: 不使用網路,只讀取本地快取資料
// LOAD_NO_CACHE: 不使用快取,只從網路獲取資料.
// LOAD_DEFAULT: (預設)根據cache-control決定是否從網路上取資料。
// LOAD_CACHE_ELSE_NETWORK,只要本地有,無論是否過期,或者no-cache,都使用快取中的資料。複製程式碼
- 具體使用
WebView.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
// 設定引數即可複製程式碼
本文章是翻譯作者:Carson_Ho的博文而來,
詳細內容可參考:http://www.jianshu.com/p/5e7075f4875f