Могу ли я создать экземпляр пользовательского объекта напрямую, используя MutableLiveData в Kotlin? - PullRequest
0 голосов
/ 04 апреля 2020

Текст A и код A взяты из этой статьи .

Мне очень странно, почему они не используют код B или код C для создания экземпляра объекта пользователя. Я думаю, что Код B и Код C очень просты и понятны.

Кстати, я не тестировал Код B и Код C, но я думаю, что они правильные.

Текст A

При использовании LiveData может потребоваться асинхронный расчет значений. Например, вы можете получить пользовательские настройки и передать их в свой пользовательский интерфейс. В этих случаях вы можете использовать функцию построителя liveData для вызова функции приостановки, служащей результатом в качестве объекта LiveData. В приведенном ниже примере loadUser () является функцией приостановки, объявленной в другом месте. Используйте функцию построителя liveData для асинхронного вызова loadUser (), а затем используйте emit () для выдачи результата

Код A

val user: LiveData<User> = liveData {
    val data = database.loadUser() // loadUser is a suspend function.
    emit(data)
}

Код B

val user: LiveData<User> = MutableLiveData<User>(database.loadUser())

Код C

val user = MutableLiveData<User>(database.loadUser())

1 Ответ

1 голос
/ 04 апреля 2020

Когда вы используете подходы B или C к этому коду, вы вызываете конструктор MutableLiveData(), который является простым старым вызовом конструктора, то есть он выполняется синхронно, блокирующим образом. Когда вы передаете ему вызов, такой как database.loadUser(), это выражение сначала будет оцениваться (опять же, блокирующим и синхронным в том же потоке), а затем его результат передается в конструктор.

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

Сопрограммы позволяют вам разрешить go текущего потока, используя функции приостановки. Вы не можете просто смешивать и сочетать функции блокировки и приостановки, поскольку это не имеет смысла. Вместо этого вам нужно вызывать функции приостановки внутри сопрограмм.

Функция построителя liveData позволяет создавать экземпляр LiveData и передавать его данные с помощью сопрограмм, асинхронно , с возможностью вызвать функции приостановки, такие как loadUser() в примере, которая может быть функцией приостановки. Таким образом, создание этого LiveData будет быстрым и неблокирующим, в то время как сопрограмма, которую вы определяете в этом компоновщике, может выполняться асинхронно, и установить результат в LiveData, используя emit(), когда он будет загружен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...