Yandex Mapkit SDK - слушатели нажатия на карту и на placeholders уничтожаются сборщиком мусора
Добавляю слушатели таким образом:
val listener = object : InputListener {
override fun onMapLongTap(p0: Map, p1: Point) {}
override fun onMapTap(p0: Map, p1: Point) {
//do something...
}
}
map.map.addInputListener(listener)
Через несколько секунд они перестают работать, а в логах ошибка:
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<MarkerData>()
private fun addMarkers(dataList: List<MarkerData>) {
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)
}
}
Вы можете исключить эту обертку но суть в том, что при добавлении маркера вы все равно получаете его экземпляр который можете сохранить в ваш список и очистить тогда когда посчитаете нужным.