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