J'essaie de charger dans mon WebView du code HTML contenant du JavaScript.
Maintenant, je veux tester si mon WebView est chargé avant 5 secondes. J'ai essayé la méthode getProgress()
, mais il m'arrive parfois de constater que l'avancement est égal à 100, mais ma vue Web n'est pas chargée.
Existe-t-il un autre moyen de s’assurer que ma Webview est chargée à 100%?
Ceci est une partie de mon code:
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);
Comme dit ici: Comment écouter une WebView finissant de charger une URL?
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;
}
}
});
Vous devez écraser la onPageFinished
de WebViewClient
Voici un exemple pour vous
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
}
}
Vous pouvez essayer d'étendre WebChromeClient, substituer onProgressChanged(WebView view, int newProgress)
et l'enregistrer sur votre méthode WebView avec la méthode setWebChromeClient(WebChromeClient)
. Cela libérera votre application du thread supplémentaire que vous démarrez simplement pour vérifier si la progression a changé. Utilisez le rappel, c'est plus simple. Donc, ce serait la première chose.
En outre, j’expérimentais également ce statut de progrès et j’en suis arrivé à des conclusions sur son comportement:
stopLoading()
sur votre WebView, En résumé, cette barre de progression indique si WebView a fini de charger le site ou non, mais en termes de WebKit et non en termes de téléchargement complet de la page. N'oubliez pas que la connexion peut se bloquer, que les ressources (images, css, js) risquent de ne pas se charger pour une raison quelconque, que JavaScript peut charger d'autres ressources lorsque la page se terminera, etc. cette progression ne permet pas de savoir si le contenu était entièrement chargé ou non, cela vous indique que WebView pense que cela devrait être tout.
Je n'ai aucune autre idée sur la façon de vérifier si la page a été entièrement chargée ou pas, je pense que c'est le seul moyen.
Le meilleur moyen de détecter si une page a été rendue est d'utiliser le onPageCommitVisible callback, disponible à partir de l'API 23. onPageLoadFinished n'est pas approprié car il est livré trop tôt (lorsque le code HTML est traité, mais pas encore rendu).
webview.setWebViewClient(new WebViewClient() {
@Override
public void onPageCommitVisible (WebView view,
String url)
}
}
Les solutions ci-dessus ne fonctionnaient pas pour moi, je voulais m'assurer que la page était chargée à 100% puis injecter du javascript pour effectuer des recherches intensives sur la page. Je suis venu avec la solution suivante avec peu de déviation de la solution fournie par NeTeInStEiN. Cela peut ne pas fonctionner pour tout le monde mais cela a fonctionné pour moi. Encore une fois, cela dépend de ce que vous essayez d’atteindre de la page finie.
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
}
}
J'espère que cela t'aides.
webView.setWebChromeClient(new WebChromeClient() {
public void onProgressChanged(WebView view, int progress) {
if (progress == 100) {
//do your task
}
}
});
Définition d'un WebChromeClient pour WebView Autre moyen de déterminer le moment du chargement de la page
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();
}
}
});
Le code ci-dessous fonctionne parfaitement. Une fois la page chargée avec succès, onPageFinished () se déclenchera
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);
}
});