D yandex maps runtime java object is already finalized nothing to do

Yandexmapkit-android repository from Yandexmobile

Запускаю карту, навешиваю CameraListener, при движении карты очищаю mapObjects и расставляю точки по видимой области. После нескольких движений карты, которые обрабатываются корректно листенер перестает вызываться и в логах начинается спам сообщения: D/yandex.maps.runtime: Java object is already finalized. Nothing to do. Можете подсказать в чем проблема?

Bedbug85

Удалось решить проблему? У меня та же ошибка, поделитесь опытом, если удалось решить.

Saint13

Это ошибка показывает, что вы работаете с объектом в проекте, который уже удален в native lib. Попробуйте убрать удалене объектов с карты.

чт, 9 авг. 2018 г., 9:59 bedbug85 [email protected] :

Добрый день!

Удалось решить проблему? У меня та же ошибка, поделитесь опытом, если удалось решить.

Спасибо.

— You are receiving this because you are subscribed to this thread. Reply to this email directly, view it on GitHub https://github.com/yandexmobile/yandexmapkit-android/issues/304#issuecomment-411657433, or mute the thread https://github.com/notifications/unsubscribe-auth/ABSEm5bHD-N_wVJ0xavaVxQcOuz6EFjmks5uO93JgaJpZM4VWaLp .

Bedbug85

Спасибо, автор проблемы уже мне ответил и поддержка яндекс тоже.

листенеры нужно явно сохранять: MapObjectTapListener и InputListener, карта хранит их по weakref, ими владеет приложение.

Если его не сохранять, то в случайные моменты времени он будет переставать работать (соберется garbage collector), и в логе будут такие сообщения.

И это было указано документации яндекс, просто не внимательно посмотрел: При дальнейшей работе Listener-объекты, сообщающие о результате многократных операций или состоянии объекта, нужно явно сохранять в памяти:

private final CameraListener cameraListener = new CameraListener() < // Do something. >
mapview.getMap().addCameraListener(cameraListener);

45p3c7

Спасибо, автор проблемы уже мне ответил и поддержка яндекс тоже.

листенеры нужно явно сохранять: MapObjectTapListener и InputListener, карта хранит их по weakref, ими владеет приложение.

Если его не сохранять, то в случайные моменты времени он будет переставать работать (соберется garbage collector), и в логе будут такие сообщения.

И это было указано документации яндекс, просто не внимательно посмотрел: При дальнейшей работе Listener-объекты, сообщающие о результате многократных операций или состоянии объекта, нужно явно сохранять в памяти:

private final CameraListener cameraListener = new CameraListener() < // Do something. >mapview.getMap().addCameraListener(cameraListener);

@bedbug85 Не мог бы ты сбросить ссылку где это указано в документации? Буду очень благодарен

Читайте также:  Для чего приложение java

Источник

Yandex Mapkit SDK — слушатели нажатия на карту и на placeholders уничтожаются сборщиком мусора

Через несколько секунд они перестают работать, а в логах ошибка:

 Java object is already finalized. Nothing to do. 

В документации сказано, что слушатели нужно обязательно сохранять через addInputListener(). Делаю это, но это не помог спасти их. Как избежать данной ошибки?

Ответы (1 шт):

В документации к Yandex MapKit описано, что слушатели имеют WeakReference, поэтому вам необходимо самим хранить слушатели в месте их использования (Fragment, Activity либо другая ваша View)

Вот мой пример метода из обертки над Yandex MapKit

fun addMarker( latitude: Double, longitude: Double, @DrawableRes imageRes: Int, userData: Any? = null ): PlacemarkMapObject < val marker = mapObjectCollection.addPlacemark( Point(latitude, longitude), ImageProvider.fromResource(context, imageRes) ) marker.userData = userData markerTapListener?.let < marker.addTapListener(it) >return marker > 

Суть в том, что при каждом добавлении маркера метод возвращает объект PlacemarkMapObject, который вы в свою очередь просто добавляете и храните в списке маркеров.

private val markerDataList = mutableListOf() private fun addMarkers(dataList: List) < for (data in dataList) < val marker = yandexMap.addMarker( latitude = data.latitude, longitude = data.longitude, imageRes = R.drawable.ic_marker, userData = data.userData ) markerDataList.add(marker) >> 

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

Источник

Оцените статью