2011-04-07 32 views
26

我想知道如何確定何時WebView是完全完成加載。如何確定Android WebView何時完成加載?

讓我定義完全

  • 所有重定向發生
  • 可見地顯示頁面,沒有任何尚未加載

不好這個問題的答案:

WebViewClient.onPageFinished() - 如果有重定向這個觸發多次加載一個頁面。它也會在頁面顯示之前觸發。

PictureListener.onNewPicture() - 每次屏幕更改和AFAICT每次重定向時都會觸發。我怎麼知道哪一次射擊是最後一次?

WebChromeClient.onProgressChanged() - 與onPageFinished相同的問題。 (在David在下面提出這個解決方案後添加)

Thread.sleep(5000) - 應該是顯而易見的,爲什麼這是不可接受的。

當然,上述工作的巧妙組合將是完美的。

爲什麼我想知道這個問題? 因爲我想注入一些JavaScript 一次一旦Webview是完全完成加載。

+1

添加到您的WebViewClient.onPageFinished()錯誤答案:根據[this](http://stackoverflow.com/a/5172952/725417),它會多次觸發**也**如果你在頁面中有幾個iframe。 – uTubeFan 2011-12-14 00:50:34

+0

@Carlos Man和你在同一個位置。唯一讓我更糟糕的是PictureListener已被棄用。你能想出一個解決方案嗎?我必須計算webview中的頁面總數,我需要將內容寬度與屏幕寬度分開。但是我不能這樣做,直到頁面完全呈現在屏幕上。任何解決方案 – 2014-09-23 20:15:15

+0

@ArunavhKrishnan上次我看着這是3年前。最後,我想我做了一些類似於接受的答案。祝你好運! – 2014-09-24 22:26:12

回答

8

感謝David Caunt建議查看響應標題。

我已經找到了以下工作得很好:

取代具有的WebView執行HTTP請求,做他們自己,所以你可以檢查重定向的HTTP狀態代碼。遵循重定向鏈。當你得到一個不是重定向的請求時,設置一個標誌並通過webview.loadDataWithBaseURL將數據發送到webview。該標誌在WebViewClient.onPageFinished()中檢查,以便知道所有重定向都完成。 javascript可以在這個時候注入。當然,頁面本身可能會在這個時候做一些JavaScript操作,但很難知道,所以向JavaScript添加延遲(比如說500ms)可以讓DOM解決。 setTimeout(function(){/* your code */}, 500)

+1

有用瞭解!至於頁面自己的JavaScript,完成後很難察覺。 – 2011-04-21 10:36:23

+1

@Carlos Rendon +1的優秀輪廓。令人驚訝的是,這並未在WebView或其任何衛星接口中實現。這個特性非常需要,但WebView人員唯一能做的就是棄用PictureListener。任何想法爲什麼? – uTubeFan 2011-12-12 03:56:09

+0

雖然在那,事實證明,我不是唯一一個夢想[在WebView中訪問http響應頭](http://stackoverflow.com/questions/3134389/access-the-http-response-headers -in-A-網頁視圖)。 – uTubeFan 2011-12-12 04:37:58

1

你看過設置自己的WebChromeClient嗎?

看起來好像onProgressUpdated可能會在頁面完全加載時通知您。

這似乎是Android內置瀏覽器使用的方法。

+0

感謝您的建議。 Unfortunatley,這與WebViewClient.onPageFinished()具有相同的問題,由於重定向,它會多次觸發。例如,在「gmail.com」上,它會在進度== 100時觸發3次。 – 2011-04-07 22:42:45

+1

什麼時候進度的下一個0值進來?如果響應發出重定向後直接觸發,則使用超時並假定您處於最後請求可能是安全的。否則,我會尋找一種方法來獲得響應頭或類似的東西。 – 2011-04-07 22:44:50

相關問題