Что такое MVPMVP - шаблон проектирования пользовательского интерфейса
M-Model : бизнес-логика приложенияV-View : система ввода/вывода вашего приложенияP-Presenter : управляет двумя вещами : 1. Реагирует на ввод данных 2. Сообщает, что выводить
Цели Moxy• Отсоединить async от lifecycle• Presenter должен переживать пересоздание
View• Пересозданная View подключается к имеющемуся
Presenter• View должна показывать актуальное состояние
Presenter• Избежать boilerplate-кода
Схема работы MoxyView Presenter Model
ViewState
Commands
Схема работы MoxyView Presenter Model
ViewState
Commands
ViewState
Схема работы MoxyView Presenter Model
Commands
Схема работы MoxyView
ViewState
Presenter Model
Commands
Схема работы MoxyView
ViewState
Presenter Model
Commands
View
Схема работы MoxyView
ViewState
Presenter Model
Commands
View
Схема работы MoxyView
ViewState
Presenter Model
Commands
View
Схема работы MoxyView
ViewState
Presenter Model
Commands
View
Схема работы MoxyView
ViewState
Presenter Model
Commands
View
Схема работы MoxyView
ViewState
Presenter Model
Commands
ViewView
Схема работы MoxyView
ViewState
Presenter Model
Commands
ViewView
ViewView
Схема работы Moxy
ViewState
Presenter Model
Commands
ViewView
Схема работы Moxy
ViewState
Presenter Model
Commands
Moxy – примерЗадача: сделать экран авторизации
•По нажатию на кнопку входа:– Показать прогресс запроса– Начать асинхронный запрос авторизации
•После завершения асинхронного запроса авторизации:– Скрыть прогресса запроса– Если авторизация прошла успешно, то перейти на
главный экран– Если пришла ошибка, то показать диалог с ошибкой
Moxy – пример Задача: сделать экран авторизации
Решение:•Сделать SignInView•Сделать SignInActivity•Сделать SignInPresenter
Moxy – пример@StateStrategyType(AddToEndSingleStrategy.class)public interface SignInView extends MvpView { void showProgress();
void hideProgress();
void showError(Throwable exception);
void hideError();
@StateStrategyType(SingleStateStrategy.class) void onSignIn();}
public class SignInActivity extends MvpActivity implements SignInView, UsersCounterView { @InjectPresenter SignInPresenter mSignInPresenter; @InjectPresenter UsersCounterPresenter mUsersCounterPresenter; ...
Moxy – пример@InjectViewStatepublic class SignInPresenter extends MvpPresenter<SignInView> { @Inject Repository mRepository;
public SignInPresenter() { SampleApplication.getAppComponent().inject(this); }
public void auth(String login, String password) { getViewState().hideError(); getViewState().showProgress(); mRepository.authentication() .signIn(login, password) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) ↓↓↓
↓↓↓ .subscribe( ignored -> { getViewState().hideProgress(); getViewState().onSignIn(); }, throwable -> { getViewState().hideProgress(); getViewState().showError(throwable); });
Жизненный цикл компонентов MoxyView == ActivityPresenterStore: пока жив процесс, получить доступ можно через MvpFacade.getInstance().getPresenterStore()Presenter:
LOCAL(default): пока View не финишируетGLOBAL: пока живёт процессWEAK: пока не финишируют все View
ViewState: пока жив Presenter(в save state не сохраняется)
СоветыДля инициализации Presenter сделайте метод Presenter.init()Автокомплит работает сразу, без компиляции проектаПроект соберется даже без кодогенерацииМожно не использовать аннотацииMvpDelegate поможет превратить любой класс во View
Как наладить диалогиМежду разными View: фантомный диалог
View1 → Presenter1 → Model → Presenter2 → View2
Между разными Presenter:Presenter1 → Model → Presenter2
Как не стоит делать:Presenter1 → View → Presenter2