Когда вы используете подходы B или C к этому коду, вы вызываете конструктор MutableLiveData()
, который является простым старым вызовом конструктора, то есть он выполняется синхронно, блокирующим образом. Когда вы передаете ему вызов, такой как database.loadUser()
, это выражение сначала будет оцениваться (опять же, блокирующим и синхронным в том же потоке), а затем его результат передается в конструктор.
Проблема с этим заключается в том, что если вы находитесь в главном потоке во время всего вызова конструктора и независимо от того, что вы передаете в него, вы блокируете весь этот поток на время загрузки данных.
Сопрограммы позволяют вам разрешить go текущего потока, используя функции приостановки. Вы не можете просто смешивать и сочетать функции блокировки и приостановки, поскольку это не имеет смысла. Вместо этого вам нужно вызывать функции приостановки внутри сопрограмм.
Функция построителя liveData
позволяет создавать экземпляр LiveData
и передавать его данные с помощью сопрограмм, асинхронно , с возможностью вызвать функции приостановки, такие как loadUser()
в примере, которая может быть функцией приостановки. Таким образом, создание этого LiveData
будет быстрым и неблокирующим, в то время как сопрограмма, которую вы определяете в этом компоновщике, может выполняться асинхронно, и установить результат в LiveData
, используя emit()
, когда он будет загружен.