Перейти к основному содержимому

Общие принципы

Отложенные результаты

Некоторые методы SDK (например, методы, которые обращаются к удалённому серверу) возвращают отложенные результаты (Future). Для работы с ними создайте обработчик получения данных и обработчик ошибок.

Пример получения объекта из справочника:

// Создать объект для поиска по справочнику
val searchManager = SearchManager.createOnlineManager(sdkContext)

// Получить объект из справочника по идентификатору
val future = searchManager.searchByDirectoryObjectIds(listOf(objectId))

// Обработать результат
future.onResult { directoryObjects ->
val directoryObject = directoryObjects.firstOrNull() ?: return@onResult
Log.d("APP", "Название объекта: ${directoryObject.title}")
}

// Обработать ошибку
future.onError { error ->
Log.d("APP", "Ошибка получения информации об объекте.")
}

По умолчанию результаты обрабатываются в UI-потоке. Чтобы это изменить, для функций onResult и onError укажите Executor.

Подробнее о работе со справочником объектов см. в разделе Справочник.

Потоки значений

Некоторые объекты SDK предоставляют потоки значений, которые можно обработать. На поток значений можно подписаться, указав функцию-обработчик данных. От потока можно отписаться, когда обработка данных больше не требуется. Для работы с потоками значений используется интерфейс Channel.

Пример подписки на изменение видимой области карты (поток новых прямоугольных областей):

// Подписаться и обрабатывать результаты в главной очереди
// Значения будут присылаться при любом изменении видимой области до момента отписки
// Важно сохранить соединение с каналом, иначе подписка будет уничтожена
val connection = map.camera
.statefulChanges(CameraChangeReason.STATE) { map.camera.visibleRect }
.connect { geoRect ->
Log.d("APP", "Юго-западная точка: ${geoRect.southWestPoint.latitude.value}")
}

Чтобы избежать утечки памяти, после окончания работы с каналом отпишитесь от него:

connection.close()