Перемещение задания и сопрограммного контекста в AppModule в виде синглетонов - PullRequest
0 голосов
/ 10 мая 2019

У меня есть этот код, где я указываю задание и контекст сопрограммы.Но этот код повторяется в каждом ViewModel, который у меня есть.Вопрос:

Если Job () и область действия Coroutine будут предоставлены в виде синглетонов или в моих модулях над синглтоном.То же самое без разницы (включая Dispatchers.IO) для 6 моделей представления.

private val completableJob = Job()
private val coroutineScope = CoroutineScope(Dispatchers.IO + completableJob)

1 Ответ

0 голосов
/ 10 мая 2019

В Kotlin все сопрограммы работают внутри CoroutineScope.Область действия контролирует время жизни сопрограмм через свою работу.Когда вы отменяете работу области, она отменяет все сопрограммы, запущенные в этой области.В Android вы можете использовать область действия для отмены всех запущенных сопрограмм, когда, например, пользователь уходит от действия или фрагмента.Области также позволяют указать диспетчер по умолчанию.Диспетчер контролирует, какой поток запускает сопрограмму.

Если вы собираетесь получать некоторые данные из вашей базы данных только для обновления пользовательского интерфейса, и пользователь внезапно покидает вашу деятельность, какой смысл сохранять сопрограммув живых?

, поэтому обычно сопрограмма отменяется в методе viewmodel onCleared() следующим образом:

override fun onCleared() {
    super.onCleared()
    viewModelJob.cancel()
}

, чтобы уменьшить стандартный код, вы можете использовать библиотеку:

dependencies {
    ...
    implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:x.x.x"
}

Библиотека добавляет viewModelScope в качестве функции расширения класса ViewModel.Эта область привязана к Dispatchers.Main и будет автоматически отменена после очистки ViewModel.Вместо того, чтобы создавать новую область в каждой ViewModel, вы можете просто использовать viewModelScope, а библиотека позаботится о настройке и очистке области.

class MainViewModel : ViewModel() {
    // Make a network request without blocking the UI thread
    private fun makeNetworkRequest() {
        // launch a coroutine in viewModelScope 
        viewModelScope.launch(Dispatchers.IO) {
            // slowFetch()
        }
    }

    // No need to override onCleared()
}

Однако, как указано reem.halamish

всякий раз, когда необходимо выполнить какую-либо работу (например, вставку БД), мы используем GlobalScope.launch {...}, чтобы сопрограмма выживала до тех пор, покакак приложение.

источник и дополнительная информация: https://codelabs.developers.google.com/codelabs/kotlin-coroutines/#4

...