Ho un'applicazione qui che ha una funzione di mostrare un PDI sulla mappa. È solo un POI ed è disegnato solo quando è effettivamente all'interno dell'area dello schermo visibile. Funziona perfettamente per un po ', ma se gioco con lo zoom avanti e indietro e il trascinamento, finirà per bloccarsi. Secondo Logcat, la ragione è sempre un errore OutOfMemory.Errore di memoria insufficiente durante l'utilizzo dell'API di Google Maps
Inizialmente, ho pensato che fosse un errore nell'API di Google Maps. Dopo aver fatto delle ricerche e visto alcuni post di Romain Guy, ero convinto di aver fatto qualcosa di stupido sulla mia app che mi ha tenuto a corto di memoria di tanto in tanto. Poi ho eseguito alcuni test più dettagliati con Heap Analyzer (Eclipse) e ho visto che anche se avevo 2+, a volte 3+ megabyte di memoria libera, ricevevo ancora quei fastidiosi messaggi Force Close causati da OutOfMemoryError. La maggior parte delle volte si blocca quando si tenta di allocare un blocco di memoria da 614 kb, indipendentemente da quanto mi rimane.
Questo problema si verifica molto su Nexus One 2.2.1 e su HTC Evo 2.1. Dopo alcuni piccoli test, non ho avuto alcun crash né su G1 1.6 né su Samsung Galaxy S i9000 2.1. Ma non posso dire con certezza che G1 e Galaxy non mostreranno questo problema dopo ulteriori test.
Posso solo pensare a un problema di frammentazione della memoria. Spero che questo problema abbia una soluzione. Sarò anche felice se riuscirò a rilevare questo errore e a prevenire l'arresto anomalo dell'app.
Se aiuta, ecco il 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)
Ho ricevuto le stesse segnalazioni di errore dai miei utenti che hanno OS versione 1.5, 2.1 e 2.2. Stacktrace non passa attraverso il mio codice quindi non riesco a rilevare questo errore - l'applicazione termina con FC. – tomash
Sembra davvero un problema di frammentazione.È come se la mia app avesse una perdita di memoria che diffonde piccoli blocchi di dati in tutta la mia area di memoria heap. Direi che questo tipo di comportamento potrebbe essere migliorato nelle prossime versioni di Dalvik perché potrebbe non essere un bug, ma di sicuro non è un "buon comportamento" dal momento che hai effettivamente memoria, ma il sistema non può essere utilizzato a causa della sua frammentazione. Bene, continuerò a provare a vedere cosa si può fare al riguardo. –
So che è passato più di un anno da quando è stata posta questa domanda ma è stata sviluppata una soluzione per questo problema? Sono curioso Grazie in anticipo! – Ahmed