Категория >  Новости > 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-функции. Перейти обратно к новости  |