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)
        }
    }

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

→ Ссылка