Closed cdump closed 5 years ago
@eberkovich у меня есть еще только одно место, где я взаимодействую с mapObjects: вызываю mapObjects.clear()
из onDestroy()
MainActivity
Добавил я это когда пытался обойти проблему https://github.com/yandex/mapkit-android-demo/issues/40#issuecomment-433701975 - сейчас я на 100% не помню что я этим решил, но 90% что следующую проблему:
когда приложение находилось в фоновом режиме и Android решал его выгрузить из памяти (и соотв. позвал onDestroy), то когда пользователь решал возобновить работу приложения и проходила полная инициализация, то возникала та ошибка с global reference table overflow (max=51200)
. У меня такое число объектов, что 51200 хватает, но если увеличить число объектов в 2 раза - уже не хватит, и я предположил что при выгрузке приложения эти референсы почему-то не освобождались. Никакого теоретического подтверждения у меня этому нет, и звучит довольно странно - но это стабильно вопспроизводилось и вызов .clear()
при onDestroy()
эту проблему решал.
Не могли бы Вы приложить минимальный пример демонстрирующий проблему?
Ок, попробую вопроизвести и выложить пример, но скорее на след. выходных только полуится.
Кстати, по поводу блокирования ui потока: #40 (comment)
Про ui поток: addPlacemarks
я пробовал, в моем случае оказалось на уровне обычного добавления или даже медленее (измерял не только добавление, а общее время: предварительную группировку по разным иконкам (~10 шт.), само добавление, сохранение в мой hashmap objectsStorage и т.п.), возможно я криво переписал ту часть когда экспериментировал с этим и у остальных оно действительно быстрее.
Да и без addPlacemarks достаточно быстро, особенно по сравнению с googlemaps :) Если же хочется быстрее - разбивка добавления на части по N штук и отложенный запуск добавления след. части по таймеру через 1-2 мс. хорошо повышало отзывчивость ui, хоть суммарное время и было дольше и было заметно как объекты появляются группами.
Добавил в onDestroy очитку своей мапы и крэши пропали. Думаю можно считать моим багом и закрывать issue.
@cdump если не секрет, что именно указали в onDestroy?
@cdump если не секрет, что именно указали в onDestroy?
Возможно это было что-то типа такого
mapView.map.mapObjects.clear()
Указывал
private val objectsNormal: MapObjectCollection
private val objectsFocused: MapObjectCollection
private val currentPointToMyObject = HashMap<Pair<Double,Double>, MyMapObject>()
...
fun onDestroy() {
objectsNormal.clear()
objectsFocused.clear()
currentPointToMyObject.clear()
}
где
objectsNormal = ymap.addMapObjectLayer("normal")
objectsFocused = ymap.addMapObjectLayer("focused")
mapkit 3.3.1 у меня на карте около 1 тысячи объектов, и раз в минуту происходит обновление данных с сервера: какие-то объекты появляются, какие-то удаляются. На каждом обновлении очищать и добавлять все объекты очень долго, поэтому я решил накладывать diff'ы: удалять из слоя удаленные объекты и добавлять новые:
Проблема в том, что иногда (похоже когда добавлений/удаление относительно много) случаются крэши:
Вопросы: