Общие принципы
Отложенные результаты
Некоторые методы SDK (например те, которые обращаются к удалённому серверу) возвращают отложенные результаты (Future). Для работы с ними нужно создать обработчик получения данных и обработчик ошибок.
Пример получения объекта из справочника:
// Создание объекта для поиска по справочнику
val searchManager = SearchManager.createOnlineManager(sdkContext)
// Получение объекта из справочника по идентификатору
val future = searchManager.searchByDirectoryObjectId(objectId)
// Обработка результата
future.onResult { directoryObject ->
Log.d("APP", "Название объекта: ${directoryObject.title}")
}
// Обработка ошибки
future.onError { error ->
Log.d("APP", "Ошибка получения информации об объекте.")
}
По умолчанию обработка результатов происходит в UI-потоке. Чтобы это изменить, для onResult
и onError
можно указать Executor.
Подробнее про работу со справочником можно посмотреть в разделе Справочник объектов.
Потоки значений
Некоторые объекты SDK предоставляют потоки значений, которые можно обработать, используя механизм каналов: на поток можно подписаться, указав функцию-обработчик данных, и отписаться, когда обработка данных больше не требуется. Для работы с потоками значений используется интерфейс Channel.
Пример подписки на изменение видимой области карты (поток новых прямоугольных областей):
// Выбираем канал (прямоугольники видимой области карты)
val visibleRectChannel = map.camera.visibleRectChannel
// Подписываемся и обрабатываем результаты в главной очереди. Значения будут присылаться при любом изменении видимой области до момента отписки.
// Важно сохранить соединение с каналом, иначе подписка будет уничтожена.
val connection = visibleRectChannel.connect { geoRect ->
Log.d("APP", "${geoRect.southWestPoint.latitude.value}")
}
После окончания работы с каналом важно отменить подписку, чтобы избежать утечки памяти. Для этого нужно вызвать метод close()
:
connection.close()