В моем проекте у меня есть MainActivity A (который обрабатывает навигацию приложения), фрагмент 1 (gridview), фрагмент 2 (карта).Maps API Memory Leak
Я вызываю фрагмент фрагмента из фрагмента сетки (отображающий маркер выбранной записи), используя обратный вызов в mainactivity, который заменяет фрагмент карты, помещая некоторые аргументы (для сведений о маркерах).
Все работает до сих пор, но после того, как определенное время вызова фрагмента карты получает OutOfMemory исключения:
FATAL EXCEPTION: GLThread 400 Process: XXX , PID: 2378
java.lang.OutOfMemoryError: Failed to allocate a 4194316 byte allocation with 684253 free bytes and 668KB until OOM
at dalvik.system.VMRuntime.newNonMovableArray(Native Method)
at android.graphics.Bitmap.nativeCreate(Native Method)
at android.graphics.Bitmap.createBitmap(Bitmap.java:812)
at android.graphics.Bitmap.createBitmap(Bitmap.java:789)
at android.graphics.Bitmap.createBitmap(Bitmap.java:756)
at com.google.maps.api.android.lib6.gmm6.m.c.i.a(Unknown Source)
at com.google.maps.api.android.lib6.gmm6.m.c.l.a(Unknown Source)
at com.google.maps.api.android.lib6.gmm6.m.c.l.a(Unknown Source)
at com.google.maps.api.android.lib6.gmm6.m.c.l.b(Unknown Source)
at com.google.maps.api.android.lib6.gmm6.m.c.b.ak.a(Unknown Source)
at com.google.maps.api.android.lib6.gmm6.m.c.b.as.a(Unknown Source)
at com.google.maps.api.android.lib6.gmm6.m.x.a(Unknown Source)
at com.google.maps.api.android.lib6.gmm6.m.l.a(Unknown Source)
at com.google.maps.api.android.lib6.gmm6.m.l.b(Unknown Source)
at com.google.maps.api.android.lib6.gmm6.m.cj.g(Unknown Source)
at com.google.maps.api.android.lib6.gmm6.m.cj.run(Unknown Source)
Пробовал temporarly удалить растровые изображения для карты маркеров пользовательского InfoWindow и так далее, на самом деле не влияют. Память увеличивается и увеличивается каждый раз при замене фрагмента карты.
Любая идея о том, как обращаться/уничтожить старую карту, попыталась несколькими способами и рассмотрела несколько вопросов, но не нашла правильного решения.
Это исключение, как правило, происходит только тогда, когда вы рисуете две карты одновременно на одной и той же layout..Check, которые вам вызов метода создания карты дважды? –
Вы можете использовать [LeakCanary] (https://github.com/square/leakcanary) для обнаружения утечек памяти. – Ziem
Вы имеете в виду метод getMapAsync()? который вызывается только один раз в onResume. также попытался уничтожить карту map.clear() в onDestroy, но, как прочитано в других вопросах, это не будет иметь никакого эффекта. – Norman