WebView consumiendo demasiada memoria
En mi aplicación hay dos actividades a saber A y B.
Actividad A:
- WebView Android "tel:" enlaces muestran página web no encontrada
- Android ViewPager guardar página anterior en onPageSelected
- ¿Qué significa "instalar plugin de Flash" en WebView?
- ¿Puedo introducir código JavaScript en las pestañas personalizadas de Chrome?
- WebView.addJavascriptInterface no debe ser llamado
Tiene una lista que muestra información acerca de un elemento brevemente. Cuando se hace clic en un elemento de A, carga la Actividad B.
Actividad B:
Tiene dos vistas de la tela y varias vistas de lista. La parte superior de la actividad está ocupada por la vista web de encabezado. Parte inferior de la actividad tiene el host de tabulación, que alberga la segunda vista web en la primera pestaña y la pestaña restante alberga cada una una vista de lista.
Problema:
Cuando el usuario navega de A a B, el tamaño del montón aumenta significativamente. Incluso después de navegar de nuevo de B a A, el tamaño del montón sigue siendo el mismo. Ni siquiera hay una disminución de bytes, de hecho, aumenta a veces. Sí, es debido a estas vistas web. He leído sobre fugas de memoria de vista web en SO y otros sitios. He seguido el enfoque mencionado aquí
- Añadido vista web de forma dinámica dentro de un contenedor [RelativeLayout]. Se eliminó la vista web de las actividades enDestroy
- Vista web subclasificada como se sugiere en el artículo de SO
- Borrado de la caché de la vista web cada vez, etc
No importa qué tamaño de montón no vuelve a lo que era antes de navegar a B.
Realmente apreciar si alguien me puede guiar a una posible solución
Nota:
Ya he leído esto y seguido este problema en SO. Fuga de memoria en WebView
Editar:
He intentado sin vistas web en B y el aumento en el tamaño del montón es muy, muy menos alrededor de 0,5 MB, pero con las vistas web se arruga por 4-5 MB
Los registros del tamaño del montón (conseguidos por la sugerencia siguiente mencionado aquí )
onCreate B debug.heap native: allocated 4.11MB of 4.17MB (0.01MB free) in [] debug.memory: allocated: 12.00MB of 96.00MB (1.00MB free) onDestroy B debug.heap native: allocated 8.66MB of 10.08MB (0.48MB free) in [] debug.memory: allocated: 12.00MB of 96.00MB (1.00MB free) on Resume A debug.heap native: allocated 7.94MB of 10.08MB (1.32MB free) in [] debug.memory: allocated: 12.00MB of 96.00MB (0.00MB free)
Cruzé comprobado los números tomando el volcado del montón antes y después de que B se ponga en marcha y destoryed, el tamaño del montón está muy cerca del que lo consigo en registros
- Interceptar solicitud de fuente de video HTML5 en Android WebView
- Subir una imagen de cámara o galería en WebView
- Después de un tiempo de uso, mi aplicación se congela durante el desplazamiento de un WebView, diciendo "no se pudo bloquear la superficie"
- ERROR / Web Console: Uncaught TypeError: No se puede llamar al método 'getItem' de null en http://m.youtube.com/:844
- Pase el token de acceso de Facebook al cuadro de comentarios
- Vídeo incrustado HTML5 de Android
- Trigger o Force Redraw o Re-Render de WebView
- Android: problema con la depuración de javascript en webview
Seguí una serie de pasos y reduje la huella de la memoria. Esto es lo que hice, en lugar de crear webview estáticamente a través de xml Ahora crear webview mediante programación y añadirlo a un contenedor. Una vez webview ya no es necesario eliminar la webview del contenedor, a continuación, eliminar todas las vistas de webview y llamar a destruir en él. Eventualmente, la memoria asignada se reduce.
private void releaseWebView() { webViewContainerRelView.removeAllViews(); if(mWebView != null){ mWebView.setTag(null); mWebView.clearHistory(); mWebView.removeAllViews(); mWebView.clearView(); mWebView.destroy(); mWebView = null; } }
Llamo a releaseWebView () del método onDetachedFromWindow de Activity como se muestra a continuación.
@Override public void onDetachedFromWindow() { super.onDetachedFromWindow(); releaseWebViews(); }
- Código fuente nativo de la aplicación de mensajería android
- Utilice el método de clase T extendiendo ArrayList <T>