Почему основной поток не блокируется, когда я использую viewModelScope.launch без диспетчера? ⇐ Android
Почему основной поток не блокируется, когда я использую viewModelScope.launch без диспетчера?
Итак, в 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. Я не получил исключения по поводу этой операции, поскольку ее можно выполнить только в основном потоке.
Итак, в 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. Я не получил исключения по поводу этой операции, поскольку ее можно выполнить только в основном потоке.
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение