MVVM — куда загружать данные из Интернета

#android #mvvm

#Android #mvvm

Вопрос:

Я пытаюсь использовать этот MVVM для своего приложения для Android. Я сделал много приложений, но я пытаюсь перейти на другой уровень и пытаюсь использовать MVVM. Но мне нужно понять, куда я должен загружать данные из Интернета. Я использую RxJava, но я не уверен, должен ли я загружать данные только в ViewModel. Если да, то где мне установить данные. Я использую привязку данных от Google, но я не хочу устанавливать данные в xml через ViewModel. Я хочу установить его из файла java.

Извините, если я что-то неправильно написал, отправьте ответ, и я постараюсь заполнить любую необходимую информацию.

Ответ №1:

«Запуск загрузки данных» является частью логики представления. Следовательно, это должно принадлежать ViewModel.

Подробности о том, «Как загружаются данные», например, сетевая логика, не относятся к уровню ViewModel. Я настоятельно рекомендую использовать Retrofit, поскольку вы уже используете RxJava.

Поскольку rx.Observable и databinding.ObservableField очень похожи, вы можете преобразовать их из одной формы в другую. Я написал библиотеку, которая позволяет вам это делать. Смотрите FieldUtils.java для реализации.

В любом случае, при условии, что у вас есть DataService интерфейс / класс:

 public interface DataService {
   Observable<String> loadSomeData();
}
  

вы можете создать свою ViewModel следующим образом:

 public class ExampleViewModel {
    ObservableField<String> title;

    public ExampleViewModel(DataService dataService) {
        this.title = FieldUtils.toField(dataService.loadSomeData());
    }
}
  

Затем вы можете отобразить это в своем представлении, используя синтаксис привязки данных

 <TextView
    android:text="@{viewModel.title}" />
  

Недавно я написал в блоге об использовании RxJava с MVVM. Я показал приложение, которое загружает список событий из Github с помощью Retrofit и отображает их в RecyclerView. Это было реализовано в MVVM.

Ссылка на статью: MVVM с использованием RxJava Пример привязки данных: загрузка данных с помощью модернизации

Более сложный пример, который также показывает индикатор загрузки и ошибку: DataLoadingViewModel.java .

Комментарии:

1. Спасибо за ваш ответ, я ценю это. К сожалению, мне пришлось самостоятельно изучать это на собственном горьком опыте (мне потребовалось всего несколько дней на изучение других проектов). Возвращаясь к ответу, я на самом деле использую модификацию в своем проекте с RxJava. Теперь я понимаю, что мне нужно загрузить данные в ViewModel, и привязка устанавливается через нее. Но, например, я не уверен, можно ли настроить RecyclerView в представлении (activity). Также я хотел бы знать, почему бы не использовать @Bindable вместо ObservableField (хотя, по крайней мере, мне кажется, что это одно и то же), если есть какая-то разница, дайте мне тоже знать. Еще раз спасибо 🙂

Ответ №2:

Существует два похожих архитектурных шаблона — MVP и MVVM. Основное отличие заключается в том, что в MVP parttern Presenter определяет, как отображать данные, но в MVVM pattern View получает модель и отображает себя (берет данные из модели). Классическим примером MVVM является view bindig . Но дело в том, что независимо от того, какой шаблон вы используете, вы должны получить все данные в модели — и также поместить всю свою бизнес-логику в модель.

Комментарии:

1. Итак, если я правильно понимаю, я должен загружать, обрабатывать и сохранять данные в ViewModel, а затем настраивать их для просмотра через ViewModel. Таким образом, само представление имеет почти нулевые операции с данными? Извините, я просто пытаюсь правильно понять шаблон.