安卓原生APP中經常會內嵌個H5頁面,這就需要用到WebView震嫉。很多人對WebView的使用不以為然森瘪,
覺得也就那么回事,但實際上關于WebView我們能聊得有很多...
首先我們聊聊他的出生,眾所周知,因為爸爸都是谷歌公司,WebView和Chrome瀏覽器有著緊密的關系。
他們實際上都是谷歌Chromium Project下的頂級項目,鏈接:chromium project,他們的身上流著
相似的血液,不同的是:
1. Chrome瀏覽器是多進程架構(內存換速度)票堵,WebView 是單進程架構扼睬。
2. Chrome瀏覽器內存占用比 WebView大的多。
3. Chrome支持更多的HTML5 特性悴势。
知道了webview的前世,就更有利于去使用他了窗宇。下面來聊聊他的今生
一個網頁的加載和渲染涉及到的流程很多,很多是我們android端沒法處理的特纤,那么從android開發(fā)的角度军俊,
當我們使用Webview去加載網頁的時候,該注意哪些呢捧存?或者說有哪些地方可以提高蝇完?來看看下面的幾點:
1.緩存
預加載、預緩存 可以讓加載速度的瓶頸更小矗蕊,網頁加載速度更快短蜕,? 這就涉及到Webview的緩存機制:
? Android WebView 自帶的緩存模式有5種:
? LOAD_CACHE_ONLY: 不使用網絡,只讀取本地緩存數(shù)據(jù)
? LOAD_NO_CACHE: 不使用緩存傻咖,只從網絡獲取數(shù)據(jù).
? LOAD_DEFAULT: (默認)根據(jù)cache-control決定是否從網絡上取數(shù)據(jù)朋魔。
? LOAD_CACHE_ELSE_NETWORK,只要本地有卿操,無論是否過期警检,或者no-cache孙援,都使用緩存中的數(shù)據(jù)。
? LOAD_CACHE_NORMAL: 已經廢棄(同LOAD_DEFAULT),
?使用方式:
WebView.getSettings().setCacheMode(WebSettings.XXX);
? 使用緩存后扇雕,一個是刷新機制拓售,一個是流量的問題,這兩個都需要格外注意镶奉。
2.硬件加速
? 這里的硬件加速實際上并非單指性能础淤,有很多高級特效需要硬件加速的支持,比如一些3D畫面
? 當覺得網頁卡頓或者不顯示時哨苛,可以嘗試打開
? 有四個級別:
? (1).應用級,需要在清單文件中設置
? <application?
? ? ? android:hardwareAccelerated="true">
? (2).Activity級
? <activity android:name=".TestActivity"
? ? ? android:hardwareAccelerated="false">
? </activity>
? (3).Window級別
? getWindow().setFlags(
? WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED,
? WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);
? (3).View級別
? view.setLayerType(View.LAYER_TYPE_SOFTWARE,null);
3.使用更高版本的瀏覽器內核(系統(tǒng)層面,需要會framework)
? 低版本的瀏覽器不僅性能低下鸽凶,而且對新語法支持不佳,
? 一些舊的內核可能要在html中增加'use strict'(嚴苛模式)這句話才能支持一些新的語法。
? 那么如何查看當前系統(tǒng)內核版本呢?
? 有很多方法,可以直接訪問工具類網站,如
? http://www.thismachine.info/(國外)?
? https://liulanmi.com/labs/core.html(國內)建峭,也可以直接在開發(fā)者工具里輸入navigator.userAgent查看,
? 如果可以更新的話玻侥,最好還是更新到最新的版本。
4.三方瀏覽器sdk
? 更新系統(tǒng)瀏覽器內核限制諸多,這時就要依靠第三方的瀏覽器sdk了亿蒸,這方面選擇不多,
? 國內的騰訊X5凑兰,國外的Crosswalk。個人建議用X5即可,畢竟國內的文檔全些边锁。要注意的是
? 即使引用了X5的jar包票摇,也并不代表就成功開啟了X5內核,它還要去下載一個內核才可以砚蓬。
? 并且會涉及到32位,64位等一些兼容性問題矢门,在一些小眾的芯片上甚至會奔潰。
? 具體的參考官方文檔吧灰蛙。
5.內存泄漏
?關于泄漏的有很多文章都已經寫了祟剔,這里不做詳細闡述了,基本上有這么2個點:
? (1).初始化用new的方式add到父容器里
? (2).退出時及時銷毀
public void destory() {
? if (mWebView != null) {
? ? ? ? Log.d(TAG, "WebView destory");
? ? ? ? mWebView.stopLoading();
? ? ? ? mWebView.clearHistory();
? ? ? ? mWebView.removeAllViews();
? ? ? ? mWebView.destroy();
? ? ? ? mWebView = null;
? ? ? }
? }
? 另外摩梧,我想補充一點的是物延,上面的方式是避免webview控件使用不當造成的泄漏,
? 但如果是webview里的內容造成了泄漏怎么辦?
? 首先仅父,不管是哪種泄漏叛薯,我們都應該對應用(webview)進行內存的監(jiān)控(AS用Profiler查看),
? 在PC端,可以用任務管理器查看笙纤,通過頻繁耗溜、持續(xù)的操作看看內存會不會增長。
? 使用開發(fā)者工具中的Memory還可以定位到對象的內存省容,更加方便我們查找內存泄漏的源頭
? 其原理是通過兩次內存快照(snapshot)抖拴,然后做差比較(comparison),得出新增長的內存對象腥椒。
6.調試
Android端的webview很難調試,因為無法使用開發(fā)者工具(Developer Tool)控制臺阿宅,谷歌瀏覽器可以支持遠程調試候衍,網上也有很多教程了,并不復雜洒放。
備注:
? 1.有時候會有清晰度的問題蛉鹿,要小心這兩個方法的使用:
? 自適應大小開啟后可能會導致web頁面元素縮放造成模糊現(xiàn)象
? webSetting.setUseWideViewPort(true);
? webSetting.setLoadWithOverviewMode(true);
? 2.Webview性能的量化(不服跑個分)
http://html5test.com/(不只是性能分數(shù),還有N項詳細指標,就是外網比較慢)
? 安兔兔測試:
好了,到這里往湿,webview的前世今生就聊得差不多了妖异,大家有收獲嗎?