Как передать ссылку на Activity Presenter в Fragment Presenter

202
29 августа 2018, 09:00

Всем привет, я создаю андроид приложение с архитектурой MVP. У меня есть Activity и у нее есть Presenter. Activity так же имеет Fragment и у Fragment тоже есть Presenter (буду называть Activity.Presenter и Fragment.Presenter во избежание путаницы). Задача состоит в следующем: передать из Activity или Activity.Presenter в Fragment.Presenter ссылку на Activity.Presenter. Однако, я не могу внутри Fragment пользоваться таким механизмм как getActivity(), так как Fragment не должен знать об Activity(воизбежании жестких зависимостей) а так же не могу делать Activity.Presenter Singleton'ом . Подскажите, пожалуйста, можно ли это как-то реализовать, я не против использовать dagger ну или что-то более простое. Заранее спасибо.

Answer 1

На мой взгляд, неплохой способ организации MVP во взаимодействии activity->fragment - это создавать в Activity.Presenter Fragment.Presenter. Почему я считаю это корректно?

Во-первых, фрагмент порожден активити, является его частью => это вполне логично, что логика активити знает про фрагмент. Т.о. активити может управлять фрагментом, а фрагмент при необходимости может достучаться до Activity.Presenter через интерфейс с набором необходимых функций

Во-вторых, (из практических соображений, с чем я столкнулся) однажды придется позаботиться о сохранении состояния фрагмента и активити при повороте экрана. Т.к. обычно в приложении есть какая-то навигация, то получается с т.з. Fragment.Presenter переход на другой фрагмент и поворот экрана - одно и то же (отсоединение от MVP.view). Но с точки зрения андроида - это, естественно разные вещи, т.е. при переключении фрагментов onSaveInstanceState не вызывается (из логики, что пользователь может никогда не вернутся в этот фрагмент). Получится, что просто некуда сохранять состояние (и даже если получится что-то сделать в други функциях, то потом придется бороться со сворачиванием приложения и последующим разворачиванием)

Решение: аргрегировать Fragment.Presenter в Activity.Presenter. Таким образом жизненный цикл Fragment.Presenter привязан к жизненному циклу активити. Из такой конструкции появляется важный момент: единственное, что надо сделать при повороте экрана - активити в onSaveInstanceState вытаскивает из Activity.Presenter состояние своего презентера и всех дочерних. А в onCreate это состояние можно восстановить

Благодаря такой конструкции уменьшится количество кода и странных костылей

READ ALSO
исключает ли использование synchronized, volatile?

исключает ли использование synchronized, volatile?

исключает ли использование synchronized, volatile?

142
Авторизация в JSF Java EE

Авторизация в JSF Java EE

Пишу авторизацию пользователей в моем Web приложении на JSF, возникла проблема в том, что когда мы используем теги h:inputText & h:inputSecret, а потом...

194
Склейка ByteBuf'ов netty

Склейка ByteBuf'ов netty

Если я пишу длинный запрос на сервер, к примеру 5000 байтов, то приходит только 1024, а потом приходит остальная часть

182
FTP разные кодировки названий

FTP разные кодировки названий

Использую apache ftp client, но проблема в том, что на FTP файлы с разными кодировкамиВот вывод консоли, если я ставлю UTF-8:

187