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:
- Android claro hilo webview, libre de memoria, evitar OutOfMemoryError
- Inyección de JavaScript enclick () evento dentro de WebView
- Almacenamiento en caché en la vista web de Android
- ¿Cualquier manera de agarrar un icono de la insignia del URL del Web site, programmatically?
- Selección de texto de Webview no borrada
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?
- Abrir vínculos externos en el navegador con la vista web de Android
- Haga que Espresso espere a que WebView termine de cargar
- Android CustomWebChromeClient openFileChooser Cambiar el tamaño de la imagen antes de subir
- Respuesta HTTP POST en WebView en android
- ¿Hay una manera de pre-cache de una página web para ver con un Android WebView?
- Android webview.loadUrl no cargará otra página web
- Depuración de una WebView de Android desde el PC mediante adb
- El teclado Android no se muestra al hacer clic en la entrada en la vista web
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.
- ContentProvider insert () siempre se ejecuta en el hilo de interfaz de usuario?
- Establecer textSize por programa