Android WebView的坑

磊少工作室_CTO發表於2019-01-15

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

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

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

  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,實現下返回邏輯。但是如果層級太多也不適合,適合那種一級頁面強制要求不能返回重新整理,二級以上的頁面沒有這種限制的需求。

  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等等,但相容性都不是很好,要根據業務場景進行抉擇了。

ps :最適合自己的才是最好的。

相關文章