Android MVP с EventBus и запущенной службой

Контекст

Я написал приложение для Android, чтобы играть в одиночку медиафайл с текстом, отображаемым в действии. На экране «Активность» также есть кнопка переключения «Воспроизведение-Пауза» и полоса поиска для перемотки вперед/назад с помощью перетаскивания. И Activity запускает Started Service в своем методе onCreate().

Я пытаюсь наложить приложение, подтверждающее шаблон проектирования MVP. Я ищу пример кода в качестве руководства, подходящего для такой ситуации. Ваша помощь очень ценится.

Вещи, которые я хочу узнать

  1. В случае, подобном моему, где Activity и Started Service имеют двустороннюю связь с использованием EventBus, где находится код для прослушивателя EventBus? Ведущий не играет в этом никакой роли?
  2. Как код тестируется для кода, связанного с EventBus — как модульного, так и интеграционного тестирования?
  3. Какой код приходит в Activity? Что входит в Сервис? И как выглядит контракт Presenter с Activity и Service? Наконец, как выглядит реализация этого презентера?
  4. Как вы управляете кодом для событий кликов MenuOptions в случае MVP?

Любая ссылка на существующий репозиторий кода в Github/Bitbucket действительно приветствуется, если подробное объяснение причиняет вам боль. Заранее спасибо.


person karthiks    schedule 20.06.2017    source источник


Ответы (1)


Я лично не стал бы реализовывать это с помощью EventBus. В любом случае, вот мои ответы на ваши вопросы.

  1. В случае, подобном моему, где Activity и Started Service имеют двустороннюю связь с использованием EventBus, где находится код для прослушивателя EventBus? Ведущий не играет в этом никакой роли?

Да, Presenter зарегистрирован в EventBus для прослушивания входящих событий и сообщает представлению, что отображать. И наоборот, если пользователь нажимает кнопку «Воспроизведение/Пауза», это событие доставляется в вашу службу через Presenter (возможно, через EventBus. может быть, через намерения Android, которые доставляются в службу, что угодно… но доставка этого события, т. е. через шина событий происходит в Presenter). Таким образом, Activity не общается со Службой напрямую. Это ведущий вашего представления (действия), который является посредником между представлением (действия) и службой воспроизведения.

  1. Как код тестируется для кода, связанного с EventBus — как модульного, так и интеграционного тестирования?

Вам не нужно тестировать EventBus как таковой. Это уже проверено автором библиотеки. Поэтому передайте EventBus в качестве параметра конструктора вашему ведущему, и во время модульного тестирования вы можете передать Mocked EventBus своему ведущему, чтобы проверить, правильно ли ваш презентатор регистрируется/отменяет регистрацию, и вы можете запускать некоторые события, чтобы увидеть, правильно ли событие обрабатывается презентатором. и вызывается ожидаемый метод в вашем представлении (Mock the View) и наоборот для отправки событий (например, Play / Pause) в службу.

  1. Какой код приходит в Activity? Что входит в Сервис? И как выглядит контракт Presenter с Activity и Service? Наконец, как выглядит реализация этого презентера?

См. ответ на 1. Активность просто отображает виджет пользовательского интерфейса. Перенаправляет событие кликов докладчику. Presenter взаимодействует со службой (например, через EventBus). Наоборот: если ваша служба изменит состояние (например, достигнут конец звуковой дорожки), то она сообщит Presenter (т.е. через EventBus), что воспроизведение звука завершено, и Presenter сообщает View, чтобы отобразить пользовательский интерфейс соответственно.

  1. Как вы управляете кодом для событий кликов MenuOptions в случае MVP?

Как описано в пунктах 1 и 3. Если он собирается изменить состояние вашей бизнес-логики (например, «Воспроизведение/Пауза»), он «погружается» из вашего представления (активности) через ваш презентер в бизнес-логику (т. е. службу воспроизведения).

person sockeqwe    schedule 21.06.2017
comment
Спасибо Вам большое. Я неправильно сформулировал Qn.2, но получил то, что ожидаю от вашего ответа на него. Хотя я закончил с реализацией, как вы посоветовали, чертовски приятно слышать это от такого опытного человека, как вы. Еще раз спасибо! - person karthiks; 21.06.2017