MVP Pattern Android для больших приложений

203
17 января 2020, 07:30

Пробую постигать MVP Pattern для Android приложений. Сама суть, вроде, ясна, но для совсем небольших приложений, которые обычно и бывают в примерах. При создании большого приложения возник ряд вопросов, а именно:

  1. Например, в приложении 10 activity. Следует ли создавать 10 presenter и model? Видел информацию, что 1 view = 1 presenter.
  2. Следует ли создавать presenter, если в конкретной активити к нему обращаются лишь однажды и он вызывает одноименный метод у view, где и реализован intent для перехода к следующей activity? Или это можно делать напрямую из view?
  3. Как правильно реализовать "отписку" presentera от view, дабы избежать утечек памяти?
Answer 1

1)Например, в приложении 10 activity. Следует ли создавать 10 presenter и model? Видел информацию, что 1 view = 1 presenter.

Да, лучше придерживаться паттерна 1 презентер - 1 вью. Исключение, если какая то логика часто переиспользуется. Но если она переиспользуется, то высокий шанс, что и вьюха тоже, а значит можно выделить эту логику в отдельную связку вью-презентер.

2)Следует ли создавать presenter, если в конкретной активити к нему обращаются лишь однажды и он вызывает одноименный метод у view, где и реализован intent для перехода к следующей activity?

Тут важно отличать события в презентере:

1 тип - Если событие такое, что данные должны сохраняться при пересоздании вью, то это нужно делать через презентер, чтобы не ходить за данными два раза. Например, вы нажали на кнопку, чтобы скачать список новостей. Он скачался, вы закешировали его в презентере(как вариант, сохранили в глобальную переменную в презентере) и отобразили. Пользователь повернул экран, данные из кеша подгрузились, вместо того, чтобы делать заново запрос.

2 тип - События навигации, отображение тоста и похожее - это события, которые должны произойти один раз. Вы не хотите, чтобы когда повернулся экран, появился тост с ошибкой еще раз.

Теперь ответ.

Если это событие первого типа, то очевидно что это надо делать через презентер. Это как раз один из кейсов для которого мы его и создаем. Если это событие второго типа, то решаете вы или договоренности в вашей команде. Главное, чтобы подход был консистентный. Если на одном экране для вашего кейса с интентом вы сделали презентер, а на другом экране не сделали, то это запутывает при чтении кода и лучше придерживаться одного стиля.

3)Как правильно реализовать "отписку" presentera от view, дабы избежать утечек памяти?

В onDestroy в Activity вызываете метод презентера, в котором зануляете ссылку на вью.

В onDestroyView в Fragment делаете тоже самое, если пользуетесь фрагментами

READ ALSO
Нет ответа на POST запрос retrofit2

Нет ответа на POST запрос retrofit2

Пытаюсь реализовать REST клиент для андройдаPOST запрос не возвращает json ответ

180
Ошибка Spring не выводит страницу в браузере

Ошибка Spring не выводит страницу в браузере

Я написал проект на спринге который должен через JSP открывать страницу, и там выводит информацию из MySQL о студентах(имя, фамилия, фото) когда...

215
Лямбды в Java 8, что лучше использовать - Function.identity() или t->t?

Лямбды в Java 8, что лучше использовать - Function.identity() или t->t?

Вопрос по использованию Functionidentity() метода

181
Самопроизвольный выход из цикла в AsyncTask

Самопроизвольный выход из цикла в AsyncTask

Есть цикл получения данных из xml файлаОн выполняется в AsyncTask doInBackground

174