Какую область сопрограммы использовать при вращении фрагментов? Можем ли мы запустить сопрограмму из модели представления?

#android #rotation #fragment #kotlin-coroutines #android-jetpack

Вопрос:

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

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

Я знаю, что фрагмент имеет область действия, такую как:

 fragment.lifecycleScope.launch(context = Dispatchers.IO)
 

но я не уверен, правильно ли это использовать, так как я предполагаю, что вращение устройства может отменить его.

Кроме того, я не уверен, что следующий будет правильным:

 CoroutineScope(Dispatchers.IO)
 

Ответ №1:

В пределах ViewModel u может launch {} ли сопрограмма использовать viewmodelscope такие»-

 viewModelScope.launch {
    // Coroutine that will be canceled when the ViewModel is cleared.
}
 

Затем вы можете использовать liveData для связи, fragment поскольку и LiveData, и viewmodel знают о жизненном цикле, он также будет обрабатывать сценарии вращения.

Это должно решить вашу цель.

Для использования viewModelScope нам нужна версия жизненного 2.2.0 цикла и выше

 // ViewModel
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.2.0"