ViewModel и Kotlin Coroutines : viewModelScope

Это перевод четвертой части из цикла об интеграции ViewModel c Koltin Coroutines, Data Binding и Navigation.

Чтобы более тесно на практике познакомиться с этими компонентами, записывайтесь на продвинутый курс по разработке приложения “Чат-мессенжер”

ViewModel и Котлин Корутины: viewModelScope

Добавлено в Lifecycle 2.1.0
Только Kotlin


Котлин Корутины в Android

Kotlin Coroutines – это новый способ обработки асинхронного кода. Другой способ обработки асинхронного кода – использование обратных вызовов – callbacks. Обратные вызовы – это хорошо, но если вы пишете сложный асинхронный код, вы можете получить множество уровней вложенных обратных вызовов; это делает ваш код сложным для понимания. Корутины упрощают все это, а также предоставляют простой способ убедиться, что вы не блокируете основной поток. Если вы новичок в корутинах, есть большая серия постов в блоге под названием Coroutines для Android и  Использование Kotlin Coroutines в вашем приложении для Android.

Простая корутина выглядит как блок кода, который выполняет некоторую работу:

// Don't use GlobalScope - for example purposes only
GlobalScope.launch {
    longRunningFunction()
    anotherLongRunningFunction()
}

Здесь я запускаю только одну корутину, но легко запустить сотни корутин, и, возможно, потерять их след. Если вы потеряли след корутин и выполняете какую-то работу, которую вы намеревались остановить, это называется утечкой работы (work leak).

Чтобы избежать утечек работы, вы должны организовать свои корутины, добавив их в CoroutineScope, который является объектом, который отслеживает корутины. CoroutineScopes можно отменить; и когда вы отменяете область действия, они отменяют все связанные корутины. Выше я использую GlobalScope, который, как следует из названия, CoroutineScope, который доступен глобально. Как правило, не рекомендуется использовать GlobalScope по тем же причинам, что, как правило, не рекомендуется писать глобально доступные переменные. Так что вам нужно либо создать область, либо получить доступ к ней. В ViewModels это легко, если вы используете viewModelScope.

viewModelScope

Часто, если ваша ViewModel разрушена, с ViewModel связана куча «работы», которую также следует остановить.

Например, допустим, вы готовите растровое изображение для отображения на экране. Это пример работы, которую вы должны выполнять, не блокируя основной поток, и работу, которую следует прекратить, если вы навсегда отойдете от экрана или закроете его. Для такой работы вы должны использовать viewModelScope.

viewModelScope – это свойство расширения Kotlin в классе ViewModel. Это CoroutineScope, который отменяется после уничтожения ViewModel (когда вызывается onCleared ()). Таким образом, когда вы используете ViewModel, вы можете запустить все свои корутины, используя эту область.

Вот небольшой пример:

class MyViewModel() : ViewModel() {

    fun initialize() {
        viewModelScope.launch {
            processBitmap()
        }
    }
        
    suspend fun processBitmap() = withContext(Dispatchers.Default) {
        // Do your long running work here
    }
    
}

Отличная публикация блога Easy Coroutines в Android: viewModelScope более подробно раскрывается, если вы используете Kotlin Coroutines и ViewModels. Чтобы узнать больше о корутинах и компонентах архитектуры, ознакомьтесь с документацией и докладом Understand Kotlin Coroutines on Android.

Заключение

В итоге:

  1. ViewModel обрабатывает событие onSaveInstanceState  с помощью модуля SavedStateHandle.
  2. Вы можете добавить ViewModel в Navpack для Jetpack Navigation для более точного и инкапсулированного обмена данными между фрагментами.
  3. Если вы используете библиотеку Data Binding и ViewModels, вы можете передать свою ViewModel привязке. Если вы также используете LiveData, используйте binding.setLifecycleOwner(lifecycleOwner).
  4. … И если вы используете корутины Kotlin с ViewModel, то используйте viewModelScope для автоматической отмены корутин при разрушении ViewModel.

Многие из этих интеграций были получены из прямой обратной связи и запросов сообщества. Если есть функция или интеграция ViewModel, которую вы ищете, вы можете следить за списком запросов на функции и рассмотреть возможность создания собственного запроса .

Чтобы быть в курсе того, что происходит с архитектурой и Android Jetpack, следите за блогом Android Developers Medium и следите за заметками о выпуске AndroidX .

Вопросы о какой-либо из этих функций? Оставьте комментарий! Спасибо за прочтение!

Особая благодарность Йену Лейку, Йигиту Бояру, Хосе Альсеррека, Шону МакКийану, Джише Абубакеру и Алексу Майклу Кук за их исправления и вклады.

Додати коментар