android webView重定向問題

轉載:https://blog.csdn.net/u010217289/article/details/68065017

在實際項目開發中,我們用到WebView的場景,大多是在對接協議、第三方應用或網頁時出現。

如果每次開啓一個新的WebView頁面使達到原生的返回效果,在需要到重定向的鏈接的時候就會出現中有個空白頁面,該怎麼解決,請看下面。

WebView中有兩個工具類負責管理網頁各種行爲:WebChromeClient 和 WebViewClient。分別通過 setWebChromeClient() 和 setWebViewClient() 來實例化。

WebViewClient


WebViewClient(本篇重點):

幫助WebView處理各種通知、請求事件、記錄頁面加載過程的。 其中就包括URL地址,我們可以通過它來監控到地址的調用過程。


mWebView.setWebViewClient(webViewClient);
protected WebViewClient webViewClient = new WebViewClient() {

    @Override
    public void onPageStarted(WebView view, String url, 
        Bitmap favicon) {
        super.onPageStarted(view, url, favicon);
         }
@Override public void onPageFinished(WebView view, String url) { super.onPageFinished(view, url);
       }
public boolean shouldOverrideUrlLoading(WebView view, String
     url) {
         return false;//返回true表明點擊網頁裏面的連接還是在當前的
                   webview裏跳轉,不跳到瀏覽器
    }
};

我們需要用到的相關的方法有:

shouldOverrideUrlLoading():

onPageStarted():

onPageFinished();

我們測試一下方法的執行順序。我事先在 shouldOverrideUrlLoading(),onPageStarted(),onPageFinished() 中添加的log輸出,我們觀察一下log日誌:

1、 在代碼中通過loadUrl加載百度的首頁,此時的行爲方式,Log如下:

03-29 15:30:06.514 9316-9316/com.china3s.strip E/測試: ====onPageStarted====
03-29 15:30:08.054 9316-9316/com.china3s.strip E/測試: ====onPageFinished====

2、我們點擊一下網頁中的按鈕,跳轉到其它的頁面,此時的行爲方式,Log如下:

03-29 15:56:31.094 9316-9316/com.china3s.strip E/測試: ====shouldOverrideUrlLoading====

03-29 15:56:31.294 9316-9316/com.china3s.strip E/測試: ====onPageStarted====

03-29 15:56:34.774 9316-9316/com.china3s.strip E/測試: ====onPageFinished====

3、我們點擊一下網頁中的按鈕,跳轉到其它的頁面出現重定向的時候,此時的行爲方式,Log如下:

03-29 15:57:19.654 9316-9316/com.china3s.strip E/測試: ====shouldOverrideUrlLoading====
03-29 15:57:19.954 9316-9316/com.china3s.strip E/測試: ====onPageStarted====

03-29 15:57:19.974 9316-9316/com.china3s.strip E/測試: ====shouldOverrideUrlLoading====
03-29 15:57:19.954 9316-9316/com.china3s.strip E/測試: ====onPageStarted====
03-29 15:57:21.274 9316-9316/com.china3s.strip E/測試: ====onPageFinished====

通過上述範例,我們可以得出以下結論:

1、如果是目的地址,那麼方法的執行順序是:

shouldOverrideUrlLoading() -> onPageStarted() -> onPageFinished()

shouldOverrideUrlLoading()由於它要提供給APP選擇加載網頁環境的機會,所以只要是網頁上地址請求,都會獲取 到。

 2、如果是重定向地址,在跳轉到目的地址之前會進行不斷的地址定位,每一次地址定位都會由以下執行順序體現出 來:

       onPageStarted()->shouldOverrideUrlLoading()->onPageFinished()

       我們暫且設定這種執行順序叫:Redirect

那麼一個正常的重定向地址,方法的執行順序就是:

  shouldOverrideUrlLoading()->Redirect -> … -> Redirect ->onPageStarted()->onPageFinished()

1、 如果是目的地址,那麼方法的執行順序是:

  onPageStarted() -> onPageFinished()

loadUrl()加載地址時,一般不會觸發shouldOverrideUrlLoading(),一旦觸發了,就說明這是一個重定向地址。

 

2、 如果是重定向地址,方法的執行順序就是:

       Redirect -> … -> Redirect ->onPageStarted()->onPageFinished()

綜上,如果我們想要自定義進度條,就要考慮如何避免重定向行爲造成的多次加載這種情況,(也許你的場景不需要這種保護)。我的解決方式是這樣的:

設置一個Boolean全局變量isRedirect;爲是否是重定向。

設置一個Boolean全局變量isPageOk;爲是否是加載完成。

1、在 onPageStarted() 中設置爲isRedirect = true; isPageOk = false。

2、在 onPageFinished() 中檢測,如果爲isRedirect = true,就說明已經是目的地址了就把isPageOk = true;

3、在 shouldOverrideUrlLoading() 中,設置爲isRedirect=false;

全部代碼

boolean isRedirect = false; //是否是重定向
boolean isPageOk = false; //目的地地址加載完成

protected WebViewClient webViewClient = new WebViewClient() {
    public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
        handler.proceed();  // 接受所有網站的證書
    }

    @Override
    public void onPageStarted(WebView view, String url, Bitmap favicon) {
        super.onPageStarted(view, url, favicon);
        isRedirect = true;
        isPageOk = false;
        Log.e("測試", "====onPageStarted====");
    }

    @Override
    public void onPageFinished(WebView view, String url) {
        super.onPageFinished(view, url);
        isPageOk = isRedirect;
        Log.e("測試", "====onPageFinished====");
    }

    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        Log.e("測試", "====shouldOverrideUrlLoading====");
        isRedirect = false;
        if (isPageOk) {
            //頁面跳轉
            return true;
        }
        return false;//返回true表明點擊網頁裏面的連接還是在當前的webview裏跳轉,不跳到瀏覽器
    }
};
————————————————
版權聲明:本文爲CSDN博主「落幕-無悔」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/u010217289/article/details/68065017

發佈了59 篇原創文章 · 獲贊 27 · 訪問量 18萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章