Почему основной поток не блокируется, когда я использую viewModelScope.launch без диспетчера?Android

Форум для тех, кто программирует под Android
Anonymous
Почему основной поток не блокируется, когда я использую viewModelScope.launch без диспетчера?

Сообщение Anonymous »


Итак, в ViewModel у меня есть функция, которая выполняет блокирующие и неблокирующие операции:

fun doSomethingInViewModelScope(){ viewModelScope.launch { неБлокингОдин() считать() неБлокингДва() } } весело Log.d("ViewModel", "Должно быть первым") } весело Log.d("ViewModel","Должно быть третьим") } приостановить счетчик веселья(){ вар долженCount = ложь индекс вар = 0 пока (!shouldCount){ задержка(1000) Log.d("ViewModel","Счетчик: $index") индекс +=1 долженCount = индекс == 5 } Log.d("ViewModel","Должно быть вторым") } До сих пор я думал, что если я запущу это, порядок журналов будет примерно таким:

Должен быть первым Должно быть третьим Счетчик: 0 Счетчик: 1 Счетчик: 2 . . . Должно быть вторым Или, по крайней мере, основной поток будет заблокирован, и я не смогу взаимодействовать с пользовательским интерфейсом.

После того, как я попробовал это, я был удивлен, потому что выполнение происходило последовательно:

Должен быть первым Счетчик: 0 Счетчик: 1 Счетчик: 2 . . . Должно быть вторым Должно быть третьим и счетчик в пользовательском интерфейсе не был заморожен, и я мог взаимодействовать с пользовательским интерфейсом.

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

Еще одна вещь, которую я попробовал, если я установил новое значение для LiveData следующим образом: liveDdata.value = 10. Я не получил исключения по поводу этой операции, поскольку ее можно выполнить только в основном потоке.

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