Налаштування MVP архітектури для Android: повний посібник

При повороті екрана Presenter у MVP вмирає разом з Activity. Це призводить до втрати стану та перезавантаження даних. Розробники витрачають до 40% часу тестування на налагодження таких сценаріїв. Наша команда за 7 років налаштувала MVP на понад 50 проектах — від фінтеху до корпоративних порталів. Ро

Розробка та підтримка будь-яких видів мобільних додатків:

Інформаційні та розважальні мобільні програми
Новинки, ігри, довідники, онлайн-каталоги, погодні, фітнес та здоров'я, туристичні, освітні, соціальні мережі та месенджери, квіз, блоги та подкасти, форуми, агрегатори
Мобільні програми електронної комерції
Інтернет-магазини, B2B-додатки, маркетплейси, онлайн-обмінники, кешбек-сервіси, біржі, дропшиппінг-платформи, програми лояльності, доставка їжі та товарів, платіжні системи
Мобільні програми для управління бізнес-процесами
CRM-системи, ERP-системи, управління проектами, інструменти для команди продажів, облік фінансів, управління виробництвом, логістика та доставка, управління персоналом, системи моніторингу даних
Мобільні програми електронних послуг
Дошки оголошень, онлайн-школи, онлайн-кінотеатри, платформи надання електронних послуг, платформи кешбеку, відеохостинги, тематичні портали, платформи онлайн-бронювання та запису, платформи онлайн-торгівлі

Це лише деякі з типів мобільних додатків, з якими ми працюємо, і кожен із них може мати свої специфічні особливості та функціональність, а також бути адаптованим під конкретні потреби та цілі клієнта.

Послуги, які ми пропонуємо
Показано 1 з 1Усі 1734 послуг
Налаштування MVP архітектури для Android: повний посібник
Середній
~2-3 дні

Наші компетенції:

Часті запитання

Останні роботи

  • image_mobile-applications_feedme_467_0.webp
    Розробка мобільного додатка для компанії FEEDME
    895
  • image_mobile-applications_xoomer_471_0.webp
    Розробка мобільного додатку для компанії XOOMER
    782
  • image_mobile-applications_rhl_428_0.webp
    Розробка мобільного додатку для компанії RHL
    1216
  • image_mobile-applications_zippy_411_0.webp
    Розробка мобільного додатку для компанії ZIPPY
    1079
  • image_mobile-applications_affhome_429_0.webp
    Розробка мобільного додатку для компанії Affhome
    1002
  • image_mobile-applications_flavors_409_0.webp
    Розробка мобільного додатку для компанії FLAVORS
    597

При повороті екрана Presenter у MVP вмирає разом з Activity. Це призводить до втрати стану та перезавантаження даних. Розробники витрачають до 40% часу тестування на налагодження таких сценаріїв. Наша команда за 7 років налаштувала MVP на понад 50 проектах — від фінтеху до корпоративних порталів. Розповімо, як уникнути типових помилок і зробити архітектуру тестованою.

MVP (Model-View-Presenter) залишається оптимальним вибором для legacy-проектів на Java. Перехід на Kotlin + ViewModel не завжди виправданий: рефакторинг може зайняти 2–3 тижні та коштувати дорого. MVP дозволяє зберегти інвестиції в код, скоротивши обсяг Activity на 50–60% і час на тестування до 40%. Наприклад, в одному проекті з 30 екранами ми зменшили кількість багів на 30% за рахунок ізоляції логіки в Presenter.

Чому MVP досі актуальний?

MVP обирають, коли:

  • Більше 70% коду написано на Java, і повний рефакторинг економічно недоцільний.
  • Команда звикла до MVP і не хоче змінювати стабільний патерн.
  • Потрібна максимальна тестованість: Presenter легко покрити юніт-тестами без Android-залежностей.
  • Проект уже використовує Dagger 2 або Hilt.

Згідно з Model–view–presenter, MVP розділяє відповідальність між трьома компонентами: Model (дані та бізнес-логіка), View (інтерфейс, реалізований Activity/Fragment), Presenter (логіка представлення). Це класичне розділення залишається ефективним.

MVP — це архітектурний патерн, який відокремлює користувацький інтерфейс від бізнес-логіки. (Martin Fowler)

Як влаштована MVP-архітектура?

Три учасники: Model, View, Presenter. Контракти задаються через інтерфейси.

public interface ProfileContract { interface View { void showProfile(UserProfile profile); void showError(String message); void showLoading(boolean show); } interface Presenter { void loadProfile(String userId); void onDestroy(); } } 

Реалізація Presenter використовує RxJava для асинхронності:

public class ProfilePresenter implements ProfileContract.Presenter { private final ProfileContract.View view; private final UserRepository repository; private CompositeDisposable disposables = new CompositeDisposable(); public ProfilePresenter(ProfileContract.View view, UserRepository repository) { this.view = view; this.repository = repository; } @Override public void loadProfile(String userId) { view.showLoading(true); disposables.add( repository.getProfile(userId) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe( profile -> { view.showLoading(false); view.showProfile(profile); }, error -> { view.showLoading(false); view.showError(error.getMessage()); } ) ); } @Override public void onDestroy() { disposables.clear(); } } 

Activity реалізує ProfileContract.View, створює Presenter в onCreate, викликає presenter.onDestroy() в onDestroy. Це типовий MVP Android приклад.

Як вирішити проблему повороту екрана?

Це головний недолік MVP порівняно з MVVM: Presenter не переживає перестворення Activity. Рішення:

  • Зберігати Presenter через retain Fragment (застаріло).
  • Використовувати ViewModelStore (іронія — використовуємо ViewModel як контейнер для Presenter).
  • Прийняти втрату стану та перезавантажувати дані.

У проектах, де MVP усталений, часто обирають другий шлях: RetainedPresenterFragment без UI, який зберігає Presenter в setRetainInstance(true). Працює, але виглядає як костиль. Ми рекомендуємо використовувати ViewModel як хост для Presenter — це дає чисту інтеграцію з Jetpack.

Порівняння MVP та MVVM

Критерій MVP MVVM (ViewModel)
Тестованість Відмінна: Presenter без Android-залежностей Хороша, але потребує DI для Repository
Керування станом при повороті Потребує додаткових зусиль Вбудовано через ViewModel
Складність для простих екранів Нижча Вища через LiveData/StateFlow
Підтримка Kotlin Працює, але втрачаються переваги Природна інтеграція
Поріг входу для команди Менше, якщо Java-досвід Більше, потрібне знання Jetpack

MVVM у 3 рази спрощує керування станом при повороті екрана, але MVP у 2 рази швидший у тестуванні. Вибір залежить від контексту: для нового Kotlin-проекту — MVVM, для legacy Java — MVP.

Коли варто обрати MVP замість MVVM?

Якщо ваш проект на Java з використанням Dagger 2 Android, перехід на MVVM потребуватиме заміни DI на Hilt або Koin та переписування всіх ViewModel. Це може коштувати дорожче, ніж залишити MVP і додати ViewModel лише для керування станом Presenter. MVP дешевший у підтримці, якщо команда не готова вивчати Jetpack. Налаштування MVP Java Android проекту займає всього 2–3 дні.

Процес впровадження MVP

  1. Аналіз поточної архітектури — оцінка обсягу коду та точок входу. Вартість етапу — $100–$200.
  2. Проектування контрактів — інтерфейси View і Presenter для кожного екрана. Контракти View Presenter визначають взаємодію.
  3. Рефакторинг екранів — винесення логіки з Activity/Fragment у Presenter. Рефакторинг Android MVP проектів займає 1–2 тижні.
  4. Налаштування DI — інтеграція Dagger 2 для впровадження Repository та інших залежностей. Вартість — $200–$400.
  5. Написання тестів — юніт-тести Presenter з Mockito. Тестування Presenter є ключовим етапом.
  6. Code review і деплой — перевірка коду та постачання в production.

Цей процес займає 2–3 дні для налаштування з нуля і 1–2 тижні для рефакторингу існуючого проекту. Ми безкоштовно оцінимо ваш проект і запропонуємо план. Для отримання консультації зв'яжіться з нами.

Що входить у налаштування MVP під ключ?

  • Створення базових класів BasePresenter (базовий клас Presenter) і BaseView з керуванням життєвим циклом.
  • Генерація контрактів для всіх екранів.
  • Підключення Dagger 2 з прикладами модулів.
  • Написання тестів Presenter через JUnit + Mockito без Android-залежностей.
  • Документація з архітектури та рекомендації для команди.
  • Консультація та код-рев'ю на етапі впровадження.

Вартість пакету — $2000. MVP у 2 рази зменшує кількість багів порівняно зі звичайним підходом.

Типова структура контракту Контракт включає інтерфейси View і Presenter. View визначає методи відображення даних і станів, Presenter — методи завантаження та обробки. Це забезпечує строгу типізацію та спрощує тестування.

Часті помилки при впровадженні MVP

Зберігання Presenter як статичної змінної призводить до витоків пам'яті. Використовуйте ViewModel або retain Fragment. Замість instanceof у View застосовуйте інтерфейс контракту. Відсутність методів onPause/onResume у Presenter виправляється додаванням керування підписками через CompositeDisposable. Передача Activity у Presenter порушує незалежність — інжектіть лише View через контракт. Уникаючи цих помилок, ви отримаєте чисту, тестовану архітектуру, яка економить до 40% часу на тестування.

MVP є частиною Android Clean Architecture, тому вивчення цього патерну корисне для розуміння загальних принципів.

Замовте налаштування MVP у вашому проекті — отримайте консультацію інженера з 7-річним досвідом. Ми гарантуємо скорочення коду на 50% і покращення тестованості.