Android MVP: одно действие с несколькими фрагментами

У меня есть деятельность, которая содержит несколько фрагментов, которые определяют каждый шаг в совершенно бесплатно для пользователей. Поток сложных и следующий шаг определяется действиями пользователя в предыдущих шагах.

поток, как показано ниже:

MainActivity | Fragment1 --> Fragment2 --> Fragment3 --> Fragment4
                                       
                                        --> Fragment5 --> Fragment6

после MVP у меня есть View & Presenter для каждого участвующего фрагмента. Меня беспокоит, как общаться между фрагментом и активностью способом MVP. Результат каждого фрагмента должен быть доступен Действие, чтобы решить, какой фрагмент должен быть показан далее.

один из подходов, о котором я думал, - это иметь слушателя, определенного для каждого фрагмента, который реализуется действием. Я как-то нахожу это немного уродливым, потому что в конце концов Activity должна реализовать 6 из них и не выглядит масштабируемой.

что было бы лучшим подходом?

3 ответов


Как вы уже упоминали, вы хотите общаться с фрагментами с помощью MVP.По-моему, я нашел 2 решения.

Решение 1: Обратные вызовы с использованием интерфейсов, а не создание одного интерфейса и бомбардировка множества методов, которые необходимо выполнить на activity/fragment. Попробуйте создать несколько интерфейсов и добавить методы в соответствии с вашими функциональными возможностями и реализовать их в соответствии с вашим использованием.

решение 2: Шины событий-это другое решение с использованием MVP, где ваш взгляд наблюдает за автобусом и подбирает событие. Следующие моменты, чтобы заботиться при работе с шинами событий: a. Если вы используете публикацию или подписчиков в рамках действия фрагмента, они должны быть зарегистрированы и незарегистрированы с их жизненным циклом. В противном случае, вероятно, вы столкнетесь с утечками памяти или висячими ссылками, которые могут привести к сбою вашего приложения.

b. Будьте осторожны с публикацией событий между фрагментами. События не могут быть опубликованы или получены, если фрагмент не бегущий. Если у вас есть фрагмент, публикующий сообщение в другой фрагмент, который в настоящее время не выполняется, а затем замените один на другой, вероятно, событие не будет обработано правильно. Библиотека EventBus имеет способ воспроизведения этого события, но платформа Otto этого не делает.

для шин событий вы можете ссылаться на две библиотеки: - GreenBot : https://github.com/greenrobot/EventBus - Отто : http://www.vogella.com/tutorials/JavaLibrary-EventBusOtto/article.html

вывод Если вы имеете дело с небольшими операциями над активностью/фрагментами, то лучше иметь дело с интерфейсами. Шины событий повышают производительность приложения, а также зависимости для больших областей, которые можно использовать для шин событий.


в моем проекте я использую тот факт, что каждый Fragment имеет доступ к родительскому элементу Activity. Мое решение:

enter image description here


на мой взгляд, способ MVP состоял бы в том, чтобы разделить модель между докладчиками Activity и Fragment, т. е. Активность

void onCreate(Bundle savedI ) {
    ...
    model = new Model();
    presenter = new ActivityPresenter( model );
    ...
}

FragmentA

View onCreateView(...) {
   ...
   presenter = new FragmentAPresenter( (MainActivity)getActivity().getModel() );
   ...
}

лучший подход-использовать Dagger или что-то подобное для введения таких зависимостей.

модель содержит данные и при необходимости некоторые события, которые могут быть использованы ведущими для выполнения некоторых действий, например, обновления их представлений.