Что нужно сделать в Activity / Fragment и ViewModel в MVVM
наша компания разрабатывает приложение для Android с использованием шаблона MVP некоторое время. С MVP мы помещаем всю бизнес-логику внутри докладчика и активность/фрагмент, а затем просто отвечаем за обновление просмотра при получении обратного вызова события от докладчика.
теперь мы решили попробовать MVVM с помощью Android Databinding. Кажется, что с MVVM мы можем поместить всю бизнес-логику в ViewModel (так же, как Presenter в MVP), а также уведомить представление(ы) о любых изменениях в модели данных, все в одном объекте.
но тогда, это поднимает вопрос в нашем уме, что мы должны оставить для обработки деятельностью/фрагментом? Так как мы приняли шаблон MVP, чтобы избежать fat-активность / фрагмент. Мы не хотим иметь slim-активность / фрагмент а то fat-viewmodel.
что мы думаем, что мы можем оставить для обработки по активности / фрагменту до сих пор
- запрос/проверка разрешения
- открыть Контекст
- Доступ К Ресурсам
каждая коррекция, комментарий или предложение приветствуются, так как я довольно новичок в 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
}
}
3 ответов
Да, вы можете иметь всю бизнес-логику в своей ViewModel, вот некоторые ссылки, которые я лично следует, чтобы узнать MVVM
приближение к Android с MVVM
https://github.com/ivacf/archi
MVVM на Android: что вам нужно знать
вы можете упомянуть всех своих слушателей в ViewModel, а также данные, которые будут состоять из вашей модели.
ViewModel
изменяет некоторый контент и уведомляет привязку рамки, содержание которых изменилось.
Model-модель данных, содержащая бизнес-логику и логику проверки
Вид - Определяет структуру, макет и внешний вид представления на экране
ViewModel-действует связь между представлением и моделью, имея дело с любым просмотр logic
вы не должны устанавливать слушателя в Activity.
логика должна быть записана как можно дальше в ViewModel.
некоторое время назад я написал демонстрацию MVVM(Databinding).
надеемся, это поможет вам:
ответ на ваш вопрос, который вы можете использовать слушатели интерфейса внутри mvvm так же, как и в mvp? это да, но шаблон немного отличается код u упомянутый
public interface MainActivityViewModelListener {
void onUserRefreshed(User user);
нормально для конструкций типа mvp, но для mvvm вы должны использовать правильный регистр наблюдателя и шаблон отмены регистрации, включая уведомление наблюдателей.
в mvp мы напрямую вызываем функцию интерфейса, но шаблон наблюдателя в mvvm сильно отличается от этих простых интерфейсов. шаблон Observer включить тему регистрации в клиентском классе.
Если вы хотите, как именно работает Mvvm смотрите здесь https://github.com/saksham24/Android-Firebase-Mvp-Mvc-Mvvm-chat
Это простое приложение с той же функциональностью, но написанное в трех разных форматах, чтобы дать четкое представление о разнице между mvp mvvm и mvc