#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. Таким образом, само представление имеет почти нулевые операции с данными? Извините, я просто пытаюсь правильно понять шаблон.