Tengo aquí una aplicación que tiene la función de mostrar un PDI en el mapa. Es solo un PDI y solo se dibuja cuando está realmente dentro del área de la pantalla visible. Funciona perfectamente por un tiempo, pero si juego zumbando dentro y fuera y arrastrando, finalmente se bloqueará. Según Logcat, la razón siempre es un error de OutOfMemory.Error de memoria insuficiente al utilizar la API de Google Maps
Al principio, pensé que era un error en la API de Google Maps. Después de investigar y ver algunas publicaciones de Romain Guy, estaba convencido de que había hecho algo estúpido en mi aplicación que me hacía perder la memoria de vez en cuando. Luego ejecuté algunas pruebas más detalladas con Heap Analyzer (Eclipse) y vi que a pesar de que tenía 2+, a veces 3+ megabytes de memoria libre, todavía recibía esos molestos mensajes de Force Close causados por OutOfMemoryError. La mayoría de las veces se bloquea al intentar asignar un trozo de 614kb de memoria, independientemente de cuánto me queda.
Este problema ocurre mucho en Nexus One 2.2.1 y en HTC Evo 2.1. Después de algunas pequeñas pruebas, no tuve ningún accidente ni en G1 1.6 ni Samsung Galaxy S i9000 2.1. Pero no puedo decir con certeza que el G1 y Galaxy no mostrarán este problema después de más pruebas.
Solo puedo pensar en un problema de fragmentación de la memoria. Espero que este problema tenga una solución. También me alegrará si puedo detectar este error y evitar que la aplicación se cuelgue.
Si ayuda, aquí está el Logcat:
09-29 08:58:06.661: ERROR/dalvikvm-heap(1552): 648000-byte external allocation too large for this process.
09-29 08:58:06.661: ERROR/dalvikvm(1552): Out of memory: Heap Size=9991KB, Allocated=6980KB, Bitmap Size=14510KB
09-29 08:58:06.661: ERROR/(1552): VM won't let us allocate 648000 bytes
09-29 08:58:06.672: DEBUG/AndroidRuntime(1552): Shutting down VM
09-29 08:58:06.672: WARN/dalvikvm(1552): threadid=3: thread exiting with uncaught exception (group=0x4001b390)
09-29 08:58:06.672: ERROR/AndroidRuntime(1552): Uncaught handler: thread main exiting due to uncaught exception
09-29 08:58:06.681: ERROR/AndroidRuntime(1552): java.lang.OutOfMemoryError: bitmap size exceeds VM budget
09-29 08:58:06.681: ERROR/AndroidRuntime(1552): at android.graphics.Bitmap.nativeCreate(Native Method)
09-29 08:58:06.681: ERROR/AndroidRuntime(1552): at android.graphics.Bitmap.createBitmap(Bitmap.java:569)
09-29 08:58:06.681: ERROR/AndroidRuntime(1552): at com.google.android.maps.ZoomHelper.createSnapshot(ZoomHelper.java:422)
09-29 08:58:06.681: ERROR/AndroidRuntime(1552): at com.google.android.maps.ZoomHelper.beginZoom(ZoomHelper.java:186)
09-29 08:58:06.681: ERROR/AndroidRuntime(1552): at com.google.android.maps.MapView$2.onScaleBegin(MapView.java:371)
09-29 08:58:06.681: ERROR/AndroidRuntime(1552): at android.view.ScaleGestureDetector.onTouchEvent(ScaleGestureDetector.java:208)
09-29 08:58:06.681: ERROR/AndroidRuntime(1552): at com.google.android.maps.MapView.onTouchEvent(MapView.java:646)
09-29 08:58:06.681: ERROR/AndroidRuntime(1552): at android.view.View.dispatchTouchEvent(View.java:3709)
09-29 08:58:06.681: ERROR/AndroidRuntime(1552): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:874)
09-29 08:58:06.681: ERROR/AndroidRuntime(1552): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:924)
09-29 08:58:06.681: ERROR/AndroidRuntime(1552): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:924)
09-29 08:58:06.681: ERROR/AndroidRuntime(1552): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:924)
09-29 08:58:06.681: ERROR/AndroidRuntime(1552): at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1701)
09-29 08:58:06.681: ERROR/AndroidRuntime(1552): at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1116)
09-29 08:58:06.681: ERROR/AndroidRuntime(1552): at android.app.Activity.dispatchTouchEvent(Activity.java:2068)
09-29 08:58:06.681: ERROR/AndroidRuntime(1552): at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1685)
09-29 08:58:06.681: ERROR/AndroidRuntime(1552): at android.view.ViewRoot.handleMessage(ViewRoot.java:1708)
09-29 08:58:06.681: ERROR/AndroidRuntime(1552): at android.os.Handler.dispatchMessage(Handler.java:99)
09-29 08:58:06.681: ERROR/AndroidRuntime(1552): at android.os.Looper.loop(Looper.java:123)
09-29 08:58:06.681: ERROR/AndroidRuntime(1552): at android.app.ActivityThread.main(ActivityThread.java:4595)
09-29 08:58:06.681: ERROR/AndroidRuntime(1552): at java.lang.reflect.Method.invokeNative(Native Method)
09-29 08:58:06.681: ERROR/AndroidRuntime(1552): at java.lang.reflect.Method.invoke(Method.java:521)
09-29 08:58:06.681: ERROR/AndroidRuntime(1552): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
09-29 08:58:06.681: ERROR/AndroidRuntime(1552): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
09-29 08:58:06.681: ERROR/AndroidRuntime(1552): at dalvik.system.NativeStart.main(Native Method)
Recibí los mismos informes de error de mis usuarios que tienen la versión 1.5, 2.1 y 2.2 del sistema operativo. Stacktrace no pasa por mi código, así que no puedo detectar este error: la aplicación termina con FC. – tomash
Realmente parece un problema de fragmentación.Es como si mi aplicación tuviera alguna pérdida de memoria que propagara pequeños trozos de datos por toda mi área de memoria de montón. Supongo que este tipo de comportamiento podría mejorarse en las próximas versiones de Dalvik porque puede no ser un error, pero seguro que no es un "buen comportamiento", ya que en realidad tiene memoria pero el sistema no puede usarla debido a su fragmentación. Bueno, seguiré intentando ver qué se puede hacer al respecto. –
Sé que ha pasado más de un año desde que se hizo esta pregunta, pero ¿se ha desarrollado una solución para este problema? Soy curioso. ¡Gracias por adelantado! – Ahmed