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