2010-09-13 20 views
10

Por alguna razón el onPageFinished está disparando antes de la vista Web ha terminado de cargar - No puedo entender por qué ...no onPageFinished disparar correctamente cuando se representa la página web

public class WebViewClientTest extends Activity { 
/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    final WebView webview = (WebView) findViewById(R.id.webview); 

    webview.setWebViewClient(new WebViewClient() { 
     @Override 
     public void onPageFinished(WebView view, String url) { 
      super.onPageFinished(webview, url); 
      webview.scrollTo(0, 500); 
     } 
    }); 
    webview.loadUrl("http://www.google.co.uk/search?sourceid=chrome&ie=UTF-8&q=lala"); 

} 
} 

OK, así que parece así no está arreglado Creo que hay una condición de carrera al cargar la página, pero no se puede obtener un comportamiento reproducible.

Estoy almacenando el contenido HTML de una página web en una base de datos SQLite para ver cuando está fuera de línea. Vuelvo a cargar el contenido en el WebView con:

webView.loadDataWithBaseURL("fake://fake.com/", htmlBody, "text/html", "utf-8", null); 

Parece que a veces, cuando la carga WebView se dispara el método WebViewClient.onPageFinished() correctamente, y otras veces no lo hace. A veces parece que se dispara antes de que la página haya terminado de cargarse, produciendo una altura de contenido 0 e ignorando cualquier llamada de scrollTo.

¿Alguien tiene alguna experiencia con esto?

Respuesta

12

Tenía un proyecto que tenía código que tenía que ejecutarse solo después de que la vista web había mostrado su contenido, y al igual que usted, en PageFinished() no funcionaba. Disparó demasiado rápido, antes de que la vista web realmente hubiera renderizado la página.

En su lugar, tuve que usar un "PictureListener" que se dispara cuando la vista web realmente actualiza la pantalla.

que lo utilice de esta manera:

mWebView.setPictureListener(new MyPictureListener()); 
//... and then later on.... 
class MyPictureListener implements PictureListener { 

    @Override 
    public void onNewPicture(WebView view, Picture arg1) { 
     // put code here that needs to run when the page has finished loading and 
     // a new "picture" is on the webview.  
    }  
} 
+0

Perfecto - gracias! Solo quiero agregar que esto en NewPicture se dispara incluso después de que un evento de desplazamiento ha terminado, así que tuve que codificar esto, pero lo anterior funciona perfectamente. – DaBeeeenster

+3

, excepto que ahora está en desuso (compatibilidad con tabletas - cielo) :( Así que utilizo una llamada javascript que supera el WebChromeClient onProgressChanged() en términos de tiempo de devolución ... Sólo tiene que tener cuidado en qué Thread está operando cuando obtienes la devolución (uso el Handler de WebView con una llamada retrasada) - todo lo que se dice, voy a ver qué tan bien WebChromeClient.onProgressChanged() realiza – Dan

+0

hay una mejor manera de hacerlo –

1

Hmm, bueno si hago mi propia clase privada, funciona ...

private class ViewStoryWebViewClient extends WebViewClient { 
    @Override 
    public void onPageFinished(WebView view, String url) { 
     super.onPageFinished(webView, url); 
     webView.scrollTo(0, 50); 
    } 
} 
+1

esto sucede demasiado pronto, antes de que se represente –

0

estoy recibiendo exactamente lo mismo con loadDataWithBaseURL(). A veces, los contenidos no aparecen y el contenido Height es 0. Lo extraño es que al hacer clic en cualquier parte de la vista web, se mostrarán los contenidos. Además, si llama al zoomIn();zoomOut(); en el método onPageFinished(), aparecerá la página.

EDITAR: El problema con mi código es que el contenido HTML tenía una ventana ficticia.location = asignación en el evento onload, y esto causaba que el contenido original no se cargara en momentos aleatorios. Lo siento, no creo que esto esté relacionado con lo que estás viendo.

4

que tenían el mismo problema para despedir mi progressdialog al representar mi página web. Lo resolví con onPageStarted. Espero que esta solución pueda ayudarlo.

@Override 
    public void onPageFinished(WebView view, String url) { 
     super.onPageFinished(view, url); 

     progressBar.dismiss(); 

    } 

    @Override 
    public void onPageStarted(WebView view, String url, 
      android.graphics.Bitmap favicon) { 

     if (!progressBar.isShowing()) { 
      progressBar.show(); 
     } 
    }; 
+0

Éste funciona para mí. Tengo una vista web que anula la carga de la URL. –

Cuestiones relacionadas