у пользователя Обработка запроса в бизнес моделе Observe изменений свойств Отрисовка изменений интерфейса Установка свойств модели Отписка от свойств view model
(Intents) Обработка запроса в бизнес моделе Observe ViewState Отрисовка изменений интерфейса • Подписка на события (Intents) • Подписка на ViewState Reduce состояния Намерение на взаимоотписку • Отписка от событий (Intents) • Отписка от ViewState
View Interface Proxy Достает presenter / инстанциирует его Способ работы Оборачивает View Proxy, Связывает Fragment и Presenter Сообщает о событии Через proxy* вызывает метод 1 2 3 Обработка интерсепторов
View Interface Достает presenter / инстанциирует его Способ работы Связывает Fragment и Presenter Сообщает о событии Вызывает метод у view 1 2 3 Сохраняет / восстанавливает состояние
View State Достает presenter / инстанциирует его Способ работы Связывает Fragment, Presenter и ViewState Сообщает о событии Вызывает команду у view 1 2 3 Вызывает метод Обработка стратегий
Ровно один Ровно один Ровно один Ровно один Несколько место задания presenter аннотация @ActivityView, @FragmentView, @CustomView у класса view аннотация @RequiresPresenter указывается у класса view переопределяем метод createPresenter у класса view переопределяем метод createPresenter у класса view аннотации @InjectPresenter @ProvidePresenter Presenter constructors • Конструктор по умолчанию • Inject аннотация из JSR 330 • Конструктор по умолчанию • Передается в onCreate фабрика по созданию презентера Конструктор с параметрами создается в типизированном метод createPresenter Конструктор с параметрами создается в типизированном метод createPresenter • Конструктор по умолчанию • Конструктор с параметрами в методах с аннотациями @ProvidePresenter
кодогенерация + модификация bytecode: - генерируются провайдер презентера - при модификации байткода привязывется провайдер - при инициализации класса вызывается конструктор презентера / ждет ручного задания Reflection / Factory - приинициализац ии класса вызывается фабрика - По умолчанию ReflectionFactory по аннотации @RequiresPresente r вызывает дефолтный конструктор Explicit - при инициализации явно создает инстанс презентера в колбэке view Explicit - при инициализации явно создает инстанс презентера в колбэке view compile time кодогенерация Android классы в презенте - Bundle - - -
Презентеры живут пока не финиширует вью Singleton - PresenterStorage Презентеры живут пока не финиширует вью Singleton PresenterSavior Регулируется при помощи конфигурации при создании Singleton PresenterManager Singleton PresenterStorage События при detached view Теряются Выполняются со стратегией Выполняется с интерсептором через InvocationHandler Теряются Выполняются со стратегией Сохранение состояния - На основе restartable Полуавтоматическ ое на Rx subject ручное во ViewState Автоматическое во ViewState Восстановление после уничтожения системой - Rx restartable - ручное во ViewState -
Fragment, Activity, Custom View от базовых классов Android наследование от базового класса либо композиция с делегатом наследование от базового класса либо композиция с делегатом наследование от базового класса наследование от базового класса либо композиция с делегатом исключения для Proguard - Presenter Distinct Comparator - - Информация по работе Патчинг байткода + кодеин Сложная логика операций Много рефлексии Много писать руками Команды у вью
Способ работы Factory View Model Store 1 - 1 View Model Providers View Model Stores Запрашиваем инстанс View Model Provider 1 Запрашиваем инстанс View Model Store 2 Holder Fragment static 3 Запрашиваем инстанс Holder Fragment Создаем инстанс Factory 0
Delegate Presenter Manager Создает делегат Достает presenter / инстанциирует его Связывает Fragment и Presenter 1 2 3 Подписывается на интенты Подписывается на View State
EasyMVP - Nucleus - ThirtyInch - Mosby - Moxy MVVM MVI - Mosby - Moxy? Выводы Вопросы по presentation слою закрыты. Почти Не бойтесь экспериментировать! Думайте! Изучайте исходники Мысли по реализациям В MVP Moxy выглядит самым крутым MVVM JetPack не требует общего хранилища MVI Mosby супертестируемо, но пока сыровато Суперидея