Собираетесь неправильно использовать ViewModel и несколько источников данных?

#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() буду обновлять, будет таким, что я попробую это сделать и проведу некоторое тестирование.