2012-01-17 19 views
8

La actividad principal de mi aplicación es Activity que contiene un Webview para cargar páginas web.¿Cómo controlar el uso de la memoria al llamar a múltiples WebView en Android?

Anulo el método shouldOverrideUrlLoading(WebView view, String url) para hacer que cada solicitud de URL invoque un Intent y cargue en una nueva actividad que contenga WebView.

Hacer esto es para proporcionar una mejor experiencia cuando se presiona la tecla ATRÁS, simplemente finalizará la actividad actual y volverá a la actividad anterior, no necesita tiempo para volver a comparar la página para usar goBack() en una sola vista web.

Pero ahora el problema es que, después de abrir muchas URL, crear una larga cola de actividades en segundo plano, la memoria que utiliza se hizo grande.

Cuando vuelvo al iniciador y compruebo los progresos, puedo ver que mi aplicación almacena en caché más de 200M de datos. Esto no es aceptable ...

Y es interesante que puedo ver que mi aplicación se usó en mi memoria, pero en la vista Heap de DDMS en Eclipse puedo ver que la aplicación asignó no más de 10M de memoria. ¿Entonces supongo que el 200M es webStorage guardado en caché por Webview?

¿Hay alguna forma de controlar la memoria?

Estoy considerando solo guardar tal vez 5 capas de actividades a la vez y cuando retroceda 5 veces simplemente regrese a la página de inicio. Pero todavía no sé cómo liberar memoria junto a las 5 actividades que necesito, que nunca volveré a usar.

O si es porque el WebView mantiene la página web en caché automáticamente, ¿cómo puedo gestionar esto manualmente? ¿Como establecer un límite de tamaño máximo de caché o recuento de páginas?

+0

Para mí, esta es una solución brutal para ganar velocidad ... Anular la forma en que funciona el botón Atrás y pasar a otra actividad con la página para mí realmente no es una solución. Debería tratar de optimizar la página para cargarla más rápido, pero usando imágenes comprimidas, comprimidas, etc. Probablemente haya otros métodos y configuraciones de WebView a los que pueda llamar para tratar de acelerar las cosas. –

Respuesta

1

En general, estoy de acuerdo con el comentario de Kevin. Creo que mantener múltiples objetos Activity para evitar la recarga de un WebView es contra-intuitivo para un entorno móvil con recursos tan limitados.

Dicho esto, tiene muchas posibilidades diferentes de preguntas y soluciones, por lo que no tengo una sola respuesta en mente. Mire a través de estos enlaces para ver si hay algo útil:

ActivityManager - tiene un montón de cosas que podría usar, consulte sus subcategorías.

ActivityManager.RunningTaskInfo - Nunca lo usé, pero parece tener algunas cosas útiles, especialmente para determinar qué Activity están en ejecución.

ActivityManager.MemoryInfo - Puede darle información sobre la memoria del sistema disponible, así como un umbral inferior de memoria.

Application.onLowMemory() - Te avisa cuando tu aplicación ha sido un recuerdo de la memoria. Puede anular este método y comenzar a destruir Activity cuando se llame. Probablemente necesite llamar al super.onLowMemory() para asegurarse de que el SO maneje lo que necesita.

Una posible solución que implica el control del número de actividades:

Anulación Application y crear un public static ArrayList<Activity> que contiene 5 Activity objetos.Siempre que realice un onCreate() para un Activity, puede agregar la Actividad al ArrayList y luego verificar el tamaño. Si el tamaño es> 5, envíe un intent al Activity en la posición 0 que hará que maneje el intento y llame al finish(). A continuación, elimine el objeto del ArrayList.

No debería ser demasiado trabajo, pero la desventaja es que tiene que administrar las cosas manualmente. Estoy seguro de que hay una solución más inteligente posible.

Cuestiones relacionadas