Los subprocesos WebView nunca se detienen (WebViewCoreThread, CookieSyncManager, http )

Utilizo un WebView para mostrar algunos contenidos de Internet en una de nuestras actividades de la aplicación.
El problema es que cuando el usuario cambia de esta actividad, los hilos de WebView continúan funcionando.
Los hilos problemáticos son:

Thread [<17> WebViewCoreThread] (Running) Thread [<25> CookieSyncManager] (Running) Thread [<19> http0] (Running) Thread [<29> http1] (Running) Thread [<31> http2] (Running) Thread [<33> http3] (Running) 

Deteniendo cada uno de estos hilos y comprobando lo que está ocupado haciendo:

 Thread [<17> WebViewCoreThread] (Suspended) Object.wait(long, int) line: not available [native method] MessageQueue(Object).wait() line: 288 MessageQueue.next() line: 148 Looper.loop() line: 110 WebViewCore$WebCoreThread.run() line: 471 Thread.run() line: 1060 Thread [<25> CookieSyncManager] (Suspended) Object.wait(long, int) line: not available [native method] MessageQueue(Object).wait(long) line: 326 MessageQueue.next() line: 144 Looper.loop() line: 110 CookieSyncManager(WebSyncManager).run() line: 90 Thread.run() line: 1060 Thread [<19> http0] (Suspended) Object.wait(long, int) line: not available [native method] RequestQueue(Object).wait() line: 288 ConnectionThread.run() line: 93 

Me pregunto cómo puedo decir el Looper en cada uno de esos hilos para salir.

Intenté llamar a webView.destroy() en el método webView.destroy() de la actividad, pero no tenía ninguna influencia.
Cuando desactivo la llamada para abrir una página web en el webView ( webView.loadUrl(...) ), esos hilos naturalmente no se inician y, por lo tanto, no se quedan después de salir de la actividad.

¿Alguna idea de cómo puedo hacer que los hilos de WebView detengan después de dejar su actividad?

Debe poder detener / reanudar estos subprocesos llamando a onPause / onResume en la vista web.

Sin embargo, están ocultos, por lo que tendrá que hacerlo a través de la reflexión. El siguiente código funcionó para mí:

 Class.forName("android.webkit.WebView").getMethod("onPause", (Class[]) null).invoke(webView, (Object[]) null); 

Donde webView es la instancia de WebView.

Consulte también: http://code.google.com/p/android/issues/detail?id=10282

Mi solución, en clase de webview extendida (probado en android 2.2, andriod 2.3, android 3.1):

 private boolean is_gone=false; public void onWindowVisibilityChanged(int visibility) {super.onWindowVisibilityChanged(visibility); if (visibility==View.GONE) {try {WebView.class.getMethod("onPause").invoke(this);//stop flash } catch (Exception e) {} this.pauseTimers(); this.is_gone=true; } else if (visibility==View.VISIBLE) {try {WebView.class.getMethod("onResume").invoke(this);//resume flash } catch (Exception e) {} this.resumeTimers(); this.is_gone=false; } } public void onDetachedFromWindow() {//this will be trigger when back key pressed, not when home key pressed if (this.is_gone) {try {this.destroy(); } catch (Exception e) {} } } 

Una solución sencilla y limpia que hace el trabajo:

 @Override public void onPause() { super.onPause(); webView.onPause(); webView.pauseTimers(); //careful with this! Pauses all layout, parsing, and JavaScript timers for all WebViews. } @Override public void onResume() { super.onResume(); webView.onResume(); webView.resumeTimers(); } @Override public void onDestroy() { super.onDestroy(); parentViewGroup.removeAllViews(); //the viewgroup the webview is attached to webView.loadUrl("about:blank"); webView.stopLoading(); webView.setWebChromeClient(null); webView.setWebViewClient(null); webView.destroy(); webView = null; } 

Eche un vistazo a este hilo de andev.org ( problema de WebViewCoreThread ).

Ver la respuesta … Re: WebViewCoreThread problema – Postby potatoho

2) Para pausar el flash usted tiene que llamar métodos ocultados WebView.onPause () / WebView.onResume ().

3) Para hacer una pausa en WebViewCoreThread, utilice WebView.pauseTimers () / WebView.resumeTimers ().

Salté el onPause / onResume, pero implementé webView.pauseTimers() y webView.resumeTimers() y por lo menos detiene el sangrado de la CPU.

También agregué CookieSyncManager.getInstance().stopSync() / startSync a mi onPause / onResume también.

Gracias por esta información, tuve este problema pausando sonidos en mi swf en webView cuando presiono el botón de bloqueo en el teléfono, onPause y onResume todavía reproduce mi swf cuando presiono el botón de desbloqueo, pero la actividad todavía no es visible, te sugiero Coloque estos en onWindowFocusChanged si desea pausar y reanudar la reproducción de swf sonidos en webView

 @Override public void onWindowFocusChanged(boolean hasFocus) { gameView = (WebView) findViewById(R.id.gameView); // TODO Auto-generated method stub if (hasFocus) { try { Class.forName("android.webkit.WebView") .getMethod("onResume", (Class[]) null) .invoke(gameView, (Object[]) null); } catch (Exception e) { } gameView.resumeTimers(); gameView.loadUrl("javascript:setflashfocus()"); } else { try { Class.forName("android.webkit.WebView") .getMethod("onPause", (Class[]) null) .invoke(gameView, (Object[]) null); } catch (Exception e) { } gameView.pauseTimers(); } super.onWindowFocusChanged(hasFocus); } 

¿Qué pasa con WebView.destroy ()? Eso parece estar limpiando cosas o sin hacer ninguna llamada de reflexión enrrollada.

Tuve que llamar a onDestroy de la WebView para borrar la memoria específicamente para la webview. Estaba cargando flash y estaba matando a mi aplicación cuando volvemos a esta actividad con una vista web. Flash te comerá vivo si no destruyes tu WebView CADA VEZ que ya estás hecho con él.

Las soluciones anteriores no para mí en Samsung Galaxy S con Android 2.3.3. Pero hice el éxito que intentaba la solución siguiente:

  webview.loadUrl("file:///android_asset/nonexistent.html"); 

Estoy obligando a la webvista a cargar un archivo html no existente. Esto parece estar forzando la webview a limpiar las cosas.

En realidad, con webView.destroy(), onPause(), clear**() no puede detener Webcore y sus subprocesos relacionados aún.

Prácticamente, una forma ideal es establecer la actividad en la que WebView reside para que se encuentre en un proceso independiente, de modo que cuando se termine la actividad, todos los subprocesos incluyendo Webcore se destruyan.

Esa es la forma en que he empleado. Tal vez también sea útil para usted.

Definir un método:

  private void hiddenWebViewMethod(String state){ if( webView != null ){ try { Method method = WebView.class.getMethod(state); method.invoke(webView); } catch (Exception e) { Log.e("TAG", "Exception: " + e.toString()); webView.loadData("", "text/html", "utf-8"); } } } 

A continuación, llame a hiddenWebViewMethod("onPause"); Para detener la carga, y hiddenWebViewMethod("onResume"); resumir.

  • OnRecivedError no muestra la página de error personalizada
  • Cómo realizar un clic de botón dentro de un Webview Android
  • ShouldOverrideUrlLoading (...) no se ejecuta si "window.location.href" modificado en una devolución de llamada de tiempo de espera
  • Android Webview Error desconocido
  • Flash no se muestra en WebView para Android 3.0.1
  • Android Cómo mostrar vínculos en la vista web de esta manera?
  • El video de YouTube no se abre en webView
  • El video de Android no se reanuda en la vista web
  • Cómo desplazar WebView a la parte superior de android?
  • Cómo enviar texto a través de formularios mediante JSoup
  • FlipAnimation causando problemas en 4.4.3
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.