91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

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

Android WebView打開網頁一片空白的解決方法

發布時間:2020-09-27 00:47:45 來源:腳本之家 閱讀:1368 作者:xxq2dream 欄目:移動開發

問題描述:

  • 網頁鏈接是Https鏈接
  • 網頁鏈接在電腦的Chrome瀏覽器中打開正常
  • 網頁鏈接在手機的Chrome瀏覽器中打開正常
  • 網頁鏈接在IOS的App上打開正常
  • 網頁鏈接在Android App中打開一片空白,沒有任何提示

 問題原因

試了很多方法,最后發現是Https的證書有問題,由于網頁鏈接是客戶提供的,不知道證書是如何生成的,導致不被Android系統信任

問題的發現之旅

網頁鏈接在手機和電腦都能打開,所以想著網頁鏈接本身應該沒有問題。

debug網頁加載的過程也沒有發現問題

但是后來用UC瀏覽器打開以后發現加載的過程中會彈出提示:

Android WebView打開網頁一片空白的解決方法

出錯的提示

根據彈出的提示知道很可能是證書的問題,于是重新開始debug項目中的WebView

一般我們在初始化一個 WebView 時都有幾個固定的步驟,其中最重要的一步就是設置 WebViewClient

enWebview.setWebChromeClient(new WebChromeClient());
enWebview.setWebViewClient(new WebViewClient());

如果WebView加載因為證書的問題失敗,就會回調 WebViewClient 的一個接口:

@Override
public void onReceivedSslError(final WebView view, final SslErrorHandler handler, SslError error) {
}

WebViewClient 默認會終止加載

public class WebViewClient {

  public void onReceivedSslError(WebView view, SslErrorHandler handler,SslError error) {
    //終止加載   
    handler.cancel();
  }
  ...
}

這個 handler 是一個 SslErrorHandler 接口

public class SslErrorHandler extends Handler {

  /**
   * @hide Only for use by WebViewProvider implementations.
   */
  @SystemApi
  public SslErrorHandler() {}

  /**
   * Proceed with the SSL certificate.
   */
  public void proceed() {}

  /**
   * Cancel this request and all pending requests for the WebView that had
   * the error.
   */
  public void cancel() {}
}

通過上面的注釋我們可以知道,調用 proceed 就是繼續利用當前證書加載,而 cancel 就是終止本次的所有請求。而上面 WebViewClient 顯然默認是終止所有請求了。

通過debug發現, WebViewClient 在調用了上面的 SslErrorHandlercancel 方法以后,就馬上會回調 onPageFinished 方法,不會回調 onReceivedError ,所以也就不會展示自定義的加載錯誤頁面,結果就是一片空白了。

原因找到了,那怎么解決呢?

其實答案也已經在上面給出了。我們直接覆寫 WebViewClientonReceivedSslError 方法,然后根據需要做些處理。比如彈出提示框告訴用戶當前證書有問題,是否繼續加載等。

public class MyWebViewClient {

  public void onReceivedSslError(WebView view, SslErrorHandler handler,SslError error) {
    //彈出提示框,讓用戶決定是否繼續加載
    //1.用戶選擇繼續加載
   // handler.proceed();
    //2.用戶取消
    //handler.cancel()
  }
  ...
}

總結

這個問題困擾了很久,剛剛開始想到可能是WebView兼容問題,因為印象里WebView有很多坑。但是同一個客戶提供的另一個Https的鏈接是正常的,而且之前沒有出現過這種情況,于是debug進去發現網頁鏈接正常傳入了就沒多想,就認為是沒問題了。還是"too young, too simple"啊!

而且對 WebViewClientonReceivedSslError 也不熟悉,沒有想到這一層。現如今基本上所有的網頁鏈接都是 Https 的了,我們以后在開發過程中還是要注意這個問題,在 onReceivedSslError 中提前做好處理。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。

向AI問一下細節

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

AI

隆安县| 铁力市| 都昌县| 南涧| 陇川县| 承德县| 英吉沙县| 什邡市| 龙泉市| 星座| 上犹县| 河西区| 易门县| 叶城县| 石门县| 新和县| 太仓市| 沈阳市| 怀宁县| 永寿县| 赣州市| 黄浦区| 饶平县| 宕昌县| 含山县| 高雄市| 迁西县| 鄯善县| 布尔津县| 明星| 临湘市| 准格尔旗| 基隆市| 兴文县| 淮北市| 盐津县| 福清市| 青海省| 望奎县| 三原县| 黄大仙区|