Android WebView的坑

記錄一些webview比較隱晦難查的問題。web

  1. 系統字體改變大小影響WebView內網頁的字體大小:設置WebView.setTextZoom(100),字體大小就只會由網頁改動,不隨系統變化。chrome

  2. 三星手機進入webview後息屏一分鐘再亮屏退出webview再進入,webview白屏:三星手機部分系統有「特殊的」省電優化,息屏後會致使webview內部長鏈接斷開,任何請求都失效了。解決辦法:每次進來都從新建立webview,所以退出的時候必需要銷燬,也保證了不會形成內存泄露。但是依然存在息屏後繼續操做webview,這時候網頁內全部的請求失效,此問題沒有很好的解決辦法,webview也沒有提供對應的重連api,可行方案:部分手機亮屏刷新頁面,直接重建webview。api

  3. webview內存泄露:緩存

1. 須要動態建立:WebView webview = new WebView(context); 
2. 銷燬:
    if(webview != null ){
        webview.destroy();
        ViewGroup parent = (ViewGroup)webview.getParent();
        if(parent != null){
            parent.removeView(webview);
        }
        webview = null;
    }
複製代碼
  1. webview返回上一級老是會刷新:從二級頁面返回到上一級無法控制不刷新。方案:1. webview.setCacheMode(LOAD_CACHE_ONLY), 只用緩存這種方式基本不適合大部分需求。2. 跳到二級頁面時從新建立一個webview,實現下返回邏輯。可是若是層級太多也不適合,適合那種一級頁面強制要求不能返回刷新,二級以上的頁面沒有這種限制的需求。bash

  2. 網頁沒法播放視頻、滑動不暢:開啓硬件加速。性能

  3. 開啓硬件加速的問題:字體

  • 硬件加速3.0以上就支持了,可是部分低版本的手機開啓硬件加速後,可能會出現閃屏、卡頓等現象;
  • 部分H5的組件、原生自定義的組件不支持硬件加速。所以只能在性能和bug中抉擇。。。
  • 低版本手機RAM小,而硬件加速須要很大的內存,因此低版本開了硬件加速反而卡頓。
  • 方案:1. 拿到userAgent中的chrome內核版本,抉擇下支持硬件加速的最低chrome內核版本。2.直接選定一個Android最低支持硬件加速的版本,我的認爲4.4是個不錯的分界點。不過這些方案都不是很完美的,部分手機仍是有第5點問題。WebView是真的坑。。。
  1. 支持HTTP2的前提條件是:Android版本4.4及以上 + Chrome內核版本41及以上。

持續更新中。。。優化

總結:webview的坑不少,H5性能上本就是一個很大的痛點,webview還搞這麼多事兒。。若是項目中問題不少的話,能夠嘗試下騰訊x5內核,兼容性更強、速度更快、大廠的技術支持,但依然會碰到一些坑。而且如今也有不少的熱更新方案:ReactNative、Weex等等,但兼容性都不是很好,要根據業務場景進行抉擇了。spa

ps :最適合本身的纔是最好的。code

相關文章
相關標籤/搜索