Что нужно сделать в 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

enter image description here

ссылка


вы не должны устанавливать слушателя в Activity.

логика должна быть записана как можно дальше в ViewModel.

некоторое время назад я написал демонстрацию MVVM(Databinding).

надеемся, это поможет вам:

https://github.com/adgvcxz/Dribbble-MVVM


ответ на ваш вопрос, который вы можете использовать слушатели интерфейса внутри 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