Почему мой ViewModelscope.launch отменяет задание из -за вращения экрана?Android

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Почему мой ViewModelscope.launch отменяет задание из -за вращения экрана?

Сообщение Anonymous »

Я пытаюсь понять конкретное поведение с Cotlin Coroutines, ViewModel и JetPack Compose. У меня холодный поток от репозитория, который я собираю в своей ViewModel. Эта ViewModel переживает вращение экрана, поэтому я ожидаю, что коллекция продолжит бесперебойную. Тем не менее, поток перезапускается каждый раз, когда я вращаю устройство. Это начинается, поэтому я вижу, когда он перезагружается.

Код: Выделить всё

import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.flow
import kotlinx.coroutines.flow.onStart

object DataRepository {
fun getDataStream(): Flow {
return flow {
var count = 0
while (true) {
emit(count++)
delay(1000)
}
}
.onStart { println("LOG: Cold flow has started.") }
}
}
< /code>

 problemviewmodel.kt
Эта ViewModel запускает Coroutine в Init, чтобы собрать поток и обновить Mutablestateflow.
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.asStateFlow
import kotlinx.coroutines.launch

class ProblemViewModel : ViewModel() {
private val _uiState = MutableStateFlow("Loading...")
val uiState = _uiState.asStateFlow()

init {
viewModelScope.launch {
DataRepository.getDataStream().collect { data ->
// I might be doing other important work here, not just updating state
println("LOG: Important work being done with data: $data")
_uiState.value = "Item: $data"
}
}
}
}
< /code>

 Composable Screen
UI просто собирает состояние и отображает его.
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
import androidx.lifecycle.viewmodel.compose.viewModel

@Composable
fun MyScreen(viewModel: ProblemViewModel = viewModel()) {
val uiState by viewModel.uiState.collectAsState()
Text(text = uiState)
}
< /code>
Точная проблема:
Когда я запускаю это и поворачиваю экран, я вижу «журнал: начался холодный поток». В моем журнале снова. Это доказывает, что коллекция перезапускается. < /P>
Мой вопрос: почему это происходит? Но это не должно означать всю работу внутри ViewModelscope.launch бессмысленная и должна быть отменена. Как вы можете видеть в моем блоке Collect, я мог бы выполнять другую важную работу, такую как ведение журнала или выполнение бэкэнд -вызова API. SharingStarted.whilesBscred (5000), ...) 
Но я не понимаю, почему это необходимо, если ViewModelsCope уже предназначен для переживания изменений конфигурации. Я хочу понять основную причину отмены. Пожалуйста, также поделитесь соответствующими ссылками на документацию, если таковые имеются.

Подробнее здесь: https://stackoverflow.com/questions/797 ... n-rotation
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»