Ich versuche in meinem WebView HTML-Code zu laden, der JavaScript enthält.
Nun möchte ich testen, ob mein WebView vor 5 Sekunden geladen ist. Ich habe die Methode getProgress()
ausprobiert, aber manchmal bekomme ich den Fortschritt auf 100, aber mein Webview wird nicht geladen.
Gibt es eine andere Möglichkeit, um sicherzustellen, dass mein Webview zu 100% geladen ist?
Dies ist ein Teil meines Codes:
sdk.getWebView().loadDataWithBaseURL("notreal/", data_html,MIME_TYPE,ENCODING_UTF_8,null);
Timer timer = new Timer();
TimerTask task = new TimerTask() {
@Override
public void run(){
Log.i("TAG", "progress fin = "+sdk.getWebView().getProgress());
if(sdk.getWebView().getProgress() <100){
//cancel the webView
sdk.getContext().runOnUiThread(new Runnable() {
@Override
public void run() {
sdk.getImgView().setVisibility(View.VISIBLE);
sdk.getWebView().setVisibility(View.GONE);
}
});
}
// else ,the Webview is loaded
else{
//prepare webview
sdk.getContext().runOnUiThread(new Runnable() {
@Override
public void run(){
// hide imageView
sdk.getImgView().setVisibility(View.GONE);
sdk.getWebView().setVisibility(View.VISIBLE);
}
});
}
}
};
timer.schedule(task, 5000);
Wie gesagt: Wie hört man auf ein WebView, das das Laden einer URL beendet?
boolean loadingFinished = true;
boolean redirect = false;
mWebView.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String urlNewString) {
if (!loadingFinished) {
redirect = true;
}
loadingFinished = false;
view.loadUrl(urlNewString);
return true;
}
@Override
public void onPageStarted(WebView view, String url, Bitmap facIcon) {
loadingFinished = false;
//SHOW LOADING IF IT ISNT ALREADY VISIBLE
}
@Override
public void onPageFinished(WebView view, String url) {
if(!redirect){
loadingFinished = true;
}
if(loadingFinished && !redirect){
//HIDE LOADING IT HAS FINISHED
} else{
redirect = false;
}
}
});
Sie müssen die onPageFinished
von WebViewClient
überschreiben.
Hier ist ein Beispiel für Sie
private class Callback extends WebViewClient {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return true;
}
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
//do what you want to do
}
}
Sie können versuchen, WebChromeClient zu erweitern, onProgressChanged(WebView view, int newProgress)
zu überschreiben und es in Ihrer WebView mit der setWebChromeClient(WebChromeClient)
-Methode zu registrieren. Dadurch wird Ihre Anwendung von dem zusätzlichen Thread befreit, den Sie gerade starten, um nur zu überprüfen, ob sich der Fortschritt geändert hat. Verwenden Sie den Rückruf, es ist einfacher. Das wäre also das Erste.
Eine andere ist, dass ich auch mit diesem Fortschrittsstatus experimentiert habe und zu einigen Schlussfolgerungen zu dessen Verhalten gekommen bin:
stopLoading()
in Ihrem WebView aufrufen. Zusammenfassend lässt sich sagen, dass diese Fortschrittsleiste darauf hinweist, ob WebView die Website vollständig geladen hat oder nicht, jedoch in Bezug auf WebKit, nicht in Bezug auf den vollständig heruntergeladenen Seiteninhalt. Sie müssen bedenken, dass die Verbindung abstürzen kann, Ressourcen (Bilder, CSS, Js) möglicherweise aus irgendeinem Grund nicht geladen werden. JavaScript kann einige weitere Ressourcen laden, wenn die Seite vollständig geladen wird usw. Dieser Fortschritt kann Ihnen nicht sagen, ob die Websites vorhanden sind Der Inhalt wurde vollständig geladen oder nicht, er sagt Ihnen, dass WebView der Meinung ist, dass dies alles sein sollte.
Ich habe keine anderen Ideen, wie man prüfen kann, ob die Seite voll geladen ist oder nicht. Ich denke, das ist der einzige Weg.
Der beste Weg, um herauszufinden, ob eine Seite gerendert wurde, ist die Verwendung von onPageCommitVisible callback, die in API 23 verfügbar ist. OnPageLoadFinished ist nicht geeignet, da sie zu früh geliefert wird (wenn der HTML-Code verarbeitet, aber noch nicht gerendert wurde).
webview.setWebViewClient(new WebViewClient() {
@Override
public void onPageCommitVisible (WebView view,
String url)
}
}
Obige Lösungen funktionierten nicht für mich, ich wollte sicherstellen, dass ich die Seite zu 100% geladen habe und anschließend Javascript injiziere, um einige intensive Recherchen auf der Seite durchzuführen. Ich habe folgende Lösung mit wenig Abweichung von der von NeTeInStEiN bereitgestellten Lösung gefunden. Dies kann nicht für alle funktionieren, aber es hat für mich funktioniert. Wieder hängt es davon ab, was Sie von der fertigen Seite erreichen wollen.
String url; is from your activity which want to load this url
private class ExtendedWebViewClient extends WebViewClient {
private int webViewPreviousState;
private final int PAGE_STARTED = 0x1;
private final int PAGE_REDIRECTED = 0x2;
public void onPageStarted(WebView paramWebView, String paramString,
Bitmap paramBitmap) {
super.onPageStarted(paramWebView, paramString, paramBitmap);
if(paramString.contentEquals(url)) {
webViewPreviousState = PAGE_STARTED;
} else {
webViewPreviousState = PAGE_REDIRECTED;
}
// DO YOU STUFF IF NEEDED
}
public void onPageFinished(WebView paramWebView, String paramString) {
if (webViewPreviousState == PAGE_STARTED) {
// I AM GETTING HERE WHEN MY PAGE IS LOADED 100%
// NOW ITS TIME FOR ME TO RUN JAVASCRIPT FUNCTIONS
// DO YOUR STUFF
}
}
Hoffe das hilft.
webView.setWebChromeClient(new WebChromeClient() {
public void onProgressChanged(WebView view, int progress) {
if (progress == 100) {
//do your task
}
}
});
Festlegen eines WebChromeClient für WebView Eine andere Methode zum Bestimmen, wann das Laden der Seite abgeschlossen ist
mWebView.setWebChromeClient(new WebChromeClient(){
/*public void onProgressChanged (WebView view, int newProgress) Tell the Host application the current progress of loading a page.
Parameters
view WebView: The WebView that initiated the callback.
newProgress int: Current page loading progress, represented by an
integer between 0 and 100.
*/
public void onProgressChanged(WebView view, int newProgress){
Toast.makeText(getActivity().getApplicationContext(),"Page loading : " + newProgress + "%",Toast.LENGTH_SHORT).show();
if(newProgress == 100){
// Page loading finish
Toast.makeText(getActivity().getApplicationContext(),"Page loaded",Toast.LENGTH_SHORT).show();
}
}
});
Der folgende Code funktioniert einwandfrei. Sobald die Seite erfolgreich geladen wurde, wird onPageFinished () ausgelöst.
webView.setWebViewClient(new WebViewClient(){
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
Toast.makeText(getApplicationContext(),"Started",Toast.LENGTH_SHORT).show();
super.onPageStarted(view, url, favicon);
}
@Override
public void onPageFinished(WebView view, String url) {
Toast.makeText(getApplicationContext(),"Loaded",Toast.LENGTH_SHORT).show();
super.onPageFinished(view, url);
}
});