Cómo WebView.getTitle () de un hilo de interfaz de usuario?

En una subclase de WebView , solía tener esta línea en un método sobreescrito de getTitle() :

 String title = super.getTitle(); 

Funcionó bien en todas las versiones de Android , hasta que pude probar mi aplicación en un teléfono Android 4.1 , que me dio esta advertencia en esa línea super.getTitle() :

12-20 21: 38: 27.467: W / webview_proxy (2537): java.lang.Throwable: Advertencia: Se llamó un método WebView en el subproceso 'WebViewCoreThread'. Todos los métodos WebView deben ser llamados en el subproceso de la interfaz de usuario. Las versiones futuras de WebView pueden no admitir el uso en otros subprocesos.

Por lo tanto, estaba pensando en trabajar en torno a este nuevo decreto pasando a través de runOnUiThread() :

 Activity a = this.getActivity(); a.runOnUiThread(new Runnable() { public void run() { String title = super.getTitle(); } }); 

Pero este código ni siquiera compilará porque super ya no se refiere a WebView , sino a Activity .

Cualquier idea de cómo super.getTitle() desde el hilo de interfaz de usuario? (Con las restricciones descritas anteriormente, en el getTitle() de una subclase de WebView )

La respuesta de Morgan , si bien puede corregir el error de compilación, no es realmente una solución a este problema.

En primer lugar, no hace nada para cambiar la llamada a getTitle() a un hilo diferente. Ese problema subyacente es por qué Android te está dando el error en tiempo de ejecución.

Usted dice en un comentario que

Las circunstancias son que la estoy llamando en WebViewClient.onPageFinished (), que sucede no estar en el hilo de interfaz de usuario.

Eso puede ser un problema. Si está iniciando la solicitud web desde el subproceso de interfaz de usuario, entonces onPageFinished() debería llamarse de nuevo en el subproceso de interfaz de usuario. ¿Puede explicar cómo está iniciando la solicitud web y por qué lo está haciendo de esa manera? La gran mayoría de las veces, no debería estar viendo onPageFinished() llamado en segundo plano, por lo que puede tener un problema en otro lugar.

(Nota: si piensa que necesita llamar a WebView.loadUrl() en segundo plano para evitar bloquear la interfaz de usuario, consulte esta otra respuesta sobre ese problema )

Si realmente piensas que necesitas iniciar la solicitud web en segundo plano, y ves que onPageFinished() llama en segundo plano, debes tener cuidado de llamar a getTitle() en el subproceso de la interfaz de usuario.

Además, si lo está llamando desde el método onPageFinished() , entonces no hay necesidad de usar sintaxis como esta:

 String title = MyWebView.this.getTitle(); 

En ese método, se pasa la instancia de su vista web, por lo que sólo se utiliza directamente:

 public void onPageFinished (WebView view, String url) { String title = view.getTitle(); } 

Pero, como ya he dicho, eso no aborda el tema de roscado. Tendrías que mostrarnos por qué intentas usar el título de la página en ese método, pero una forma de usarlo de forma segura sería algo así:

 public void onPageFinished (final WebView view, String url) { view.post(new Runnable() { public void run() { String title = view.getTitle(); // do something with title that affects the UI here } }); } 

Tenga en cuenta que necesitaba que el parámetro view final en el código anterior.

No tengo una respuesta directa a su pregunta pero puedo sugerir una solución que funcionó para mí cuando encontré un problema similar: Encuentra el método que llama al método que llama a String title = super.getTitle(); Y ejecutarlo a través de runOnUiThread () .

HTH.

La solución directa es hacer esto

 String title = MyWebView.this.getTitle(); 

en lugar de

 String title = super.getTitle(); 

Dicho esto, sería interesante saber más sobre las circunstancias bajo las cuales usted está llamando esto (es decir, por qué lo está llamando en segundo plano). Le pregunto porque no estoy seguro de que su enfoque hará lo que quiera incluso después de hacer el cambio de código que mencioné.

Para deshacerse de esta advertencia, haga lo siguiente:

  Handler handler =new Handler(); handler.post(new Runnable() { @Override public void run() { // TODO Auto-generated method stub String URL = "http://www.superlinux.net"; //Of course the object "webview" is a WebView. //it's better to define it a global variable webview.loadUrl(URL); } }); 

Por lo tanto, utilizando esta forma, porque webview es elemento de interfaz de usuario, utiliza un objeto de controlador. Los manejadores son algún tipo de subprocesos que se ejecutan por separado de la creación de cualquier elemento de la interfaz de usuario.

  • La vista web de Android no cargará mi URL pero cargará otros
  • ExceptionInInitializerError en la aplicación de Android?
  • ¿El WebView de Android cifra las contraseñas guardadas?
  • Reproducción de un video local de aplicación (.mp4) en una vista web
  • Trigger o Force Redraw o Re-Render de WebView
  • Android Webview no puede centrarse en sus elementos
  • ¿Cómo puedo saber si mi WebView está cargado al 100%?
  • Hacer referencia a la imagen en los elementos de HTML no funciona
  • ViewPager con WebView que permite pasar y no permitir el desplazamiento de WebView
  • ERROR / Web Console: Uncaught Error: Demasiado tiempo pasado en el controlador de descarga
  • ERROR / Web Console: Uncaught TypeError: No se puede llamar al método 'getItem' de null en http://m.youtube.com/:844
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.