Что нужно сделать в Activity/Fragment и ViewModel в MVVM
Наша компания разрабатывает Android-приложение с использованием шаблона MVP. С MVP мы помещаем всю бизнес-логику внутри презентатора и Activity/Fragment, а затем просто отвечаем за обновление вида при получении обратного вызова от ведущего.
Теперь мы решили попробовать MVVM с помощью Android Databinding. Похоже, что с MVVM мы можем поместить всю бизнес-логику в ViewModel (точно так же, как Presenter в MVP), а также уведомить представление (-ы) о любых изменениях модели данных, все в одном объекте.
Но тогда, этот поднимающий вопрос в нашем уме, что мы должны оставить, чтобы обрабатывать Activity/Fragment? Поскольку мы приняли шаблон MVP, чтобы избежать жировой активности/фрагмента. Мы не хотим иметь slim-activity/fragment, а затем fat-viewmodel.
Что мы думаем, что до сих пор мы можем обрабатывать Activity/Fragment
- Запрос/Проверить разрешение
- Контекст доступа
- Ресурсы доступа
Каждая коррекция, комментарий или предложение приветствуются, поскольку я довольно новичок в MVVM, даже если это похоже на MVP.
Спасибо.
Еще немного вопросов
Возможно ли и хорошая практика объединить MVVM со слушателем (например, MVP)? Например
public class MainActivityViewModel extends BaseObservable {
MainActivityViewModelListener listener;
User user;
public void setMainActivityViewModelListener(MainActivityViewModelListener listener) {
this.listener = listener;
}
public void refreshUser(View v) {
// some user update via Internet
notifyPropertyChanged(BR.userAlias);
if (listener != null) {
listener.onUserRefreshed(user);
}
}
@Bindable
public void getUserAlias() {
return user.getAlias();
}
}
public interface MainActivityViewModelListener {
void onUserRefreshed(User user);
}
public class MainActivity implements MainActivityViewModelListener {
MainActivityBinding binding;
@Override
public void onCreate(Bundle savedInstanceState) {
binding = DataBindingUtil.setContentView(R.layout.main_activity);
MainActivityViewModel viewModel = new MainActivityViewModel();
viewModel.setMainActivityViewModelListener(this);
binding.setMainActivityViewModel(viewModel);
}
@Override
public void onUserRefreshed(User user) {
// do some update
}
}
Ответы
Ответ 1
Да, вы можете иметь всю бизнес-логику в своей модели ViewModel. Вот некоторые ссылки, которые я лично должен изучить, чтобы узнать MVVM
Подходит к Android с MVVM
https://github.com/ivacf/archi
MVVM на Android: что вам нужно знать
Вы можете указать всех своих слушателей в ViewModel, а также данные, которые будут содержать вашу модель.
ViewModel
изменяет некоторый контент и уведомляет структуру привязки, что содержимое изменилось.
Модель - модель данных, содержащая логику ведения бизнеса и проверки Посмотреть - Определяет структуру, макет и внешний вид представления на экране
ViewModel - взаимодействует между View и Model и имеет отношение к любому логика просмотра
![введите описание изображения здесь]()
ссылка
Ответ 2
Вы не должны устанавливать Listener в Activity.
Логика должна быть написана как можно дальше в ViewModel.
Я написал демо MVVM (Databinding) некоторое время назад.
Надеюсь, это поможет вам:
https://github.com/adgvcxz/Dribbble-MVVM
Ответ 3
Ответ на ваш вопрос, который вы можете использовать прослушиватели интерфейса внутри mvvm так же, как вы делаете в mvp? да, но шаблон немного отличается
код u упомянутый
public interface MainActivityViewModelListener {
void onUserRefreshed(User user);
подходит для проектов типа mvp, но для mvvm вы должны использовать правильный регистр наблюдателя и шаблон отмены регистрации, включая уведомление наблюдателей.
в mvp мы непосредственно вызываем функцию интерфейса, но шаблон наблюдателя в mvvm сильно отличается от этих простых интерфейсов. Шаблон наблюдателя включает регистрацию объектов в классе клиента.
если вы хотите, как именно Mvvm работает здесь
https://github.com/saksham24/Android-Firebase-Mvp-Mvc-Mvvm-chat
это простое приложение с одинаковой функциональностью, но написанное в трех разных форматах, чтобы дать четкое представление о различии между mvp mvvm и mvc