Ошибка нехватки памяти при использовании Google Maps API - PullRequest
7 голосов
/ 29 сентября 2010

У меня есть приложение, в котором есть функция отображения POI на карте.Это только один POI, и он рисуется только тогда, когда он действительно находится в видимой области экрана.Некоторое время он работает идеально, но если я поиграю с увеличением и уменьшением и перетаскиванием, это в конечном итоге приведет к сбою.Согласно Logcat, причиной всегда является ошибка OutOfMemory.

Сначала я подумал, что это ошибка в API Карт Google.После некоторого изучения и просмотра постов Romain Guy, я был уверен, что сделал в своем приложении что-то глупое, что время от времени не позволяло мне нехватать памяти.Затем я запустил несколько более подробных тестов с включенным Heap Analyzer (Eclipse) и увидел, что, несмотря на то, что у меня осталось 2+, иногда 3+ мегабайта свободной памяти, я все еще получал эти раздражающие сообщения Force Close, вызванные OutOfMemoryError.В большинстве случаев происходит сбой при попытке выделить часть памяти размером 614 КБ независимо от того, сколько у меня осталось.

Эта проблема часто возникает в Nexus One 2.2.1 и в HTC Evo 2.1.После небольшого тестирования я не получил сбоев ни на G1 1.6, ни на Samsung Galaxy S i9000 2.1.Но я не могу точно сказать, что G1 и Galaxy не будут показывать эту проблему после дополнительных испытаний.

Я могу думать только о проблеме фрагментации памяти.Я надеюсь, что у этой проблемы есть решение.Я также буду рад, если смогу просто уловить эту ошибку и предотвратить сбой приложения.

Если это поможет, вот 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)

Ответы [ 3 ]

1 голос
/ 20 декабря 2011

У меня была эта ТОЧНАЯ та же проблема, я засолил код с некоторыми вызовами System.GC, и это, казалось, немного помогло, но это все еще происходит.

У меня также возникает другая проблема, которая может быть связана с тем, что карта, кажется, переворачивается и становится случайной, когда вы увеличиваете масштаб.Это, как правило, случается иногда перед аварией.

Это все происходит только на HTC Desire, который, как я считаю, тот же телефон, что и Nexus One под капотом.(и во многом похож на EVO, который также страдает от этого).

Примечание. На 100% отлично работает на наших Arc-S, Galaxy V1, эмуляторе AVD и планшете Asus.*

1 голос
/ 21 ноября 2014

У меня была такая же проблема, добавьте следующую строку в файл манифеста под тегом приложения

android: largeHeap = true.Это сработало для меня

1 голос
/ 05 ноября 2010

Я сталкивался с этой проблемой в течение последнего месяца. Способ, которым я обошел проблему в своем коде, заключается в том, чтобы заставить GC очищать битовые карты без ссылок, которые я обернул в WeakReferences. Этот подход может не сработать, поскольку сбой, который вы вставили выше, кажется, происходит из MapView. В любом случае, попробуйте добавить несколько вызовов System.gc () в ключевые места в вашем коде и посмотреть системный журнал, чтобы увидеть, указывают ли сообщения GC_EXPLICIT много освобожденных объектов / байтов. В коде, над которым я работаю, мне пришлось добавить System.gc () в конце моего метода Adapter.getView (), чтобы гарантировать, что неиспользуемые растровые изображения очищаются при следующем вызове getView (). Этот подход, кажется, резко сократил мою работу с dreaded java.lang.OutOfMemoryError: размер растрового изображения превышает сбой бюджета виртуальной машины.

...