#android #android-viewmodel #objectbox
Вопрос:
Новичок в ViewModel
и MutableLiveData<>
в Android здесь, и сталкиваюсь с логикой/порядком работы, поэтому мне интересно, правильно ли я подхожу к этому.
Фон: Страница сведений, показывающая поля из общего объекта данных. Все данные, отображаемые на этой странице, получены из трех внешних источников и вызовов HTTP/GET. Сбой одного вызова не должен мешать другим правильно загружать данные. Это означает, что когда пользователь загружает страницу, данные будут заполняться по мере возврата вызовов. После завершения трех вызовов я отправляю объект для сохранения в базу данных ObjectBox.
Проблема, с которой я сталкиваюсь, заключается в том, что все возвращаемые HTTP-данные находятся в фоновом потоке, поэтому я использую a .postValue()
для сохранения данных. Когда возвращается последний вызов, я загружаю значения из ViewModel в свой объект ObjectBox и сохраняю их в базе данных.
Конечно, .getValue()
на MutableLiveData
нем есть следующее примечание:
Note that calling this method on a background thread does not guarantee that the latest value set will be received.
Именно это и происходит — к моменту запуска кода ObjectBox, вскоре после обновления с последнего вызова GET, .getValue()
вызовы не всегда возвращают правильные данные.
Есть ли вызов модели представления, который я могу использовать, чтобы указать, что обновление полей завершено, и затем обновить поле объекта? Неужели я застрял в ожидании завершения всех вызовов, прежде чем что-либо отображать (и, следовательно, сохранять свою базу данных перед обновлением дисплея)? Могу ли я использовать .setValue()
в фоновом потоке, чтобы убедиться, что данные обновляются прямо в этот момент?
Комментарии:
1. Я хочу спросить, почему вы звоните
.getValue()
или вашMutableLiveData
объект. Что технически рекомендуется, так это вносить изменения вMutableLiveData
приложение, но наблюдать за его использованиемLiveData
. У меня нет никакого вашего кода для справки, но я считаю, что это правильный путь.2. @che10 — Это было бы правильно для обновления моего пользовательского интерфейса, что я и делаю. Однако, если бы я сделал это для сохранения в поле объектов, то объект сохранялся бы/обновлялся в базе данных каждый раз, когда обновлялось отдельное поле. Если только нет способа просмотреть всю модель представления и получить уведомление, когда будет выполнено последнее обновление..
3. Можете ли вы сделать отдельный
MuableLiveData
для этого? Как в отдельном экземпляре, который, скажем, является логическим, а затем вы публикуете его значение как истинное после завершения последнего обновления и наблюдаете за ним с помощьюLiveData
4. @che10 — Ах, это хорошая идея. Я об этом не подумал. Надеюсь, порядок, в котором я
postValue()
буду обновлять, будет таким, что я попробую это сделать и проведу некоторое тестирование.