Категория > Новости > Android: советы и лайфхаки - «Новости»
Android: советы и лайфхаки - «Новости»2-05-2021, 00:00. Автор: Олег |
|
A safer way to collect flows from Android UIs — статья о том, как написать с использованием Kotlin Flow асинхронный код, который не будет страдать от проблем перерасхода ресурсов. Современный подход к написанию приложений для Android выглядит примерно так: слой бизнес‑логики выставляет наружу suspend-функции и продюсеры Flow, а UI-компоненты вызывают suspend-функции или подписываются на Flow и обновляют UI в соответствии с пришедшими данными. Выглядеть это все может примерно так. Функция — продюсер обновлений местоположения: fun FusedLocationProviderClient.locationFlow() = callbackFlow<Location> { val callback = object :LocationCallback() {override fun onLocationResult(result: LocationResult?) {result ?: returntry { offer(result.lastLocation) } catch(e: Exception) {}} } requestLocationUpdates(createLocationRequest(), callback, Looper.getMainLooper()).addOnFailureListener { e ->close(e) // In case of exception, close the Flow} awaitClose {removeLocationUpdates(callback) }}Часть UI-компонента, подписывающаяся на Flow: lifecycleScope.launchWhenStarted { locationProvider.locationFlow().collect {// Новое местоположение — обновляем UI }}На первый взгляд — все хорошо. Благодаря использованию Чтобы избежать такой проблемы, можно либо самостоятельно запускать и останавливать корутину — обработчик Flow при изменении жизненного цикла приложения, либо использовать lifecycleOwner.addRepeatingJob(Lifecycle.State.STARTED) { locationProvider.locationFlow().collect {// Новое местоположение — обновляем UI }}Выглядит почти так же, как предыдущий пример. Однако в данном случае корутина будет полностью остановлена при переходе приложения в любое состояние, отличное от Того же эффекта можно добиться, используя suspend-функцию lifecycleScope.launch { lifecycle.repeatOnLifecycle(Lifecycle.State.STARTED) {locationProvider.locationFlow().collect {// Новое местоположение — обновляем UI} }}Она удобна в тех случаях, когда перед сбором данных необходимо выполнить определенную работу внутри suspend-функции. Перейти обратно к новости |