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 Не мог бы ты сбросить ссылку где это указано в документации? Буду очень благодарен
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) >>
Вы можете исключить эту обертку но суть в том, что при добавлении маркера вы все равно получаете его экземпляр который можете сохранить в ваш список и очистить тогда когда посчитаете нужным.