欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Android WebView打開網(wǎng)頁(yè)一片空白的解決方法

 更新時(shí)間:2018年12月26日 14:24:14   作者:xxq2dream  
這篇文章主要介紹了Android WebView打開網(wǎng)頁(yè)一片空白的解決方法,試了很多方法,最后記錄一下,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧

問(wèn)題描述:

  • 網(wǎng)頁(yè)鏈接是Https鏈接
  • 網(wǎng)頁(yè)鏈接在電腦的Chrome瀏覽器中打開正常
  • 網(wǎng)頁(yè)鏈接在手機(jī)的Chrome瀏覽器中打開正常
  • 網(wǎng)頁(yè)鏈接在IOS的App上打開正常
  • 網(wǎng)頁(yè)鏈接在Android App中打開一片空白,沒(méi)有任何提示

 問(wèn)題原因

試了很多方法,最后發(fā)現(xiàn)是Https的證書有問(wèn)題,由于網(wǎng)頁(yè)鏈接是客戶提供的,不知道證書是如何生成的,導(dǎo)致不被Android系統(tǒng)信任

問(wèn)題的發(fā)現(xiàn)之旅

網(wǎng)頁(yè)鏈接在手機(jī)和電腦都能打開,所以想著網(wǎng)頁(yè)鏈接本身應(yīng)該沒(méi)有問(wèn)題。

debug網(wǎng)頁(yè)加載的過(guò)程也沒(méi)有發(fā)現(xiàn)問(wèn)題

但是后來(lái)用UC瀏覽器打開以后發(fā)現(xiàn)加載的過(guò)程中會(huì)彈出提示:

出錯(cuò)的提示

根據(jù)彈出的提示知道很可能是證書的問(wèn)題,于是重新開始debug項(xiàng)目中的WebView

一般我們?cè)诔跏蓟粋€(gè) WebView 時(shí)都有幾個(gè)固定的步驟,其中最重要的一步就是設(shè)置 WebViewClient

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

如果WebView加載因?yàn)樽C書的問(wèn)題失敗,就會(huì)回調(diào) WebViewClient 的一個(gè)接口:

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

WebViewClient 默認(rèn)會(huì)終止加載

public class WebViewClient {

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

這個(gè) handler 是一個(gè) 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() {}
}

通過(guò)上面的注釋我們可以知道,調(diào)用 proceed 就是繼續(xù)利用當(dāng)前證書加載,而 cancel 就是終止本次的所有請(qǐng)求。而上面 WebViewClient 顯然默認(rèn)是終止所有請(qǐng)求了。

通過(guò)debug發(fā)現(xiàn), WebViewClient 在調(diào)用了上面的 SslErrorHandlercancel 方法以后,就馬上會(huì)回調(diào) onPageFinished 方法,不會(huì)回調(diào) onReceivedError ,所以也就不會(huì)展示自定義的加載錯(cuò)誤頁(yè)面,結(jié)果就是一片空白了。

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

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

public class MyWebViewClient {

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

總結(jié)

這個(gè)問(wèn)題困擾了很久,剛剛開始想到可能是WebView兼容問(wèn)題,因?yàn)橛∠罄颳ebView有很多坑。但是同一個(gè)客戶提供的另一個(gè)Https的鏈接是正常的,而且之前沒(méi)有出現(xiàn)過(guò)這種情況,于是debug進(jìn)去發(fā)現(xiàn)網(wǎng)頁(yè)鏈接正常傳入了就沒(méi)多想,就認(rèn)為是沒(méi)問(wèn)題了。還是"too young, too simple"??!

而且對(duì) WebViewClientonReceivedSslError 也不熟悉,沒(méi)有想到這一層。現(xiàn)如今基本上所有的網(wǎng)頁(yè)鏈接都是 Https 的了,我們以后在開發(fā)過(guò)程中還是要注意這個(gè)問(wèn)題,在 onReceivedSslError 中提前做好處理。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

最新評(píng)論