Как получать данные мгновенно с помощью компонентов архитектуры? - PullRequest
0 голосов
/ 20 ноября 2018

Я пытаюсь реализовать рекомендованную архитектуру от Google, и в уроке они показывают эту диаграмму:

Architecture Components design

Итак, у меня есть MainActivity иКогда приложение запускается, оно должно пойти и получить некоторые данные из Интернета.Я делаю эти сетевые операции в репозитории.Теперь моя проблема в том, что я не знаю, как правильно общаться между действиями и хранилищем.Например, MainActivity запускается и сразу отображает круговой индикатор выполнения, пока репозиторий извлекает данные.Как я могу остановить анимацию в MainActivity, как только данные будут вставлены в базу данных?Я думаю, что я мог бы позвонить observe() на LiveData и ждать onChanged().Есть ли лучший подход?Что делать, если нет новых данных?Тогда onChanged() не будет вызван ...

Возможно, я мог бы отправить намерение из репозитория в MainActivity, когда нет данных, поэтому MainActivity знает, что должно остановить анимацию, и если оно не получает намерение, то этопросто ждет onChanged()?

Полагаю, мне просто не нравится метод onChanged(), потому что я никогда не буду уверен в операции, которой он соответствует.Возможно, до поступления данных из сети были вставлены какие-то другие данные, которые сработали onChanged(), что затем остановило бы анимацию загрузки до того, как это должно было быть.

1 Ответ

0 голосов
/ 21 ноября 2018

Относительно вашей проблемы в комментариях, которые, как я полагаю, также отвечают на ваш главный вопрос.

Вы должны наблюдать от вашего пользовательского интерфейса (действия / фрагмента) до прогресса LiveData в вашем ViewModel.Это может работать с Boolean (LiveData<Boolean>).Чтобы представить вид прогресса, видимый или нет.

Это, в свою очередь, должно взять идентичный LiveData из Репозитория (объявленного в Репозитории как MutableLiveData).Затем вы публикуете обновления для прогресса MutableLiveData в репозитории.

Теперь, когда MutableLiveData получает изменение, которое существует в вашем ViewModel, поскольку оно совместно использует ссылку на переменную, и оно передаетсянаблюдатель в вашем пользовательском интерфейсе.

-

В качестве альтернативы, вы можете вернуть LiveData<Boolean> из метода в вашем репозитории, который извлекает данные.Это можно было бы наблюдать в вашем пользовательском интерфейсе.

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

...