2017-01-26 2 views
6

Я разрабатываю приложение для Android, которое выполняет распознавание человеческой деятельности.Какую роль должен играть Android-сервис в шаблоне MVP?

В основном это работает: служба постоянно считывает данные акселератора и сохраняет признанную активность (т. Е. Ходьба, работа) в базе данных. Пользователь может видеть все признанные действия в действии ListView (обращается к базе данных). Каждая таблица пользователя в базе данных имеет поле pa_goal (цель физической активности), которое Служба считывает из базы данных и выполняет некоторые проверки.

Пользователь, конечно, может изменить эту цель из вида деятельности. Поскольку я буду реализовывать архитектурный шаблон MVP.

Я не уверен, где разместить услугу? Это, конечно, не Просмотр. Любой совет?

+0

его часть вашей модели данных, не так ли? – pskink

+0

@pskink служба хранит данные только в базе данных. Это то, что делает. Доза, которая означает, что я должен рассматривать ее как Модель? Я запутался, так как цель MVP заключается в том, чтобы отделить код Android от кода Java, поэтому, если я буду угрожать моей службе как модели, я не делаю это неправильно? –

+1

, вы используете пользовательский 'ContentProvider'? если да, посмотрите на https://github.com/googlesamples/android-architecture/tree/todo-mvp-contentproviders/ (и https://github.com/googlesamples/android-architecture в целом) – pskink

ответ

8

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

В этом случае это не тот взгляд, с которым вы имеете дело, но принцип подобен. Вы не хотите, чтобы вся ваша бизнес-логика или прикладная логика смешивались в коде Android, когда вы можете разделить их на более классные, более общие классы ответственности. Поэтому я бы сказал, что, хотя это не представление, вы все равно должны иметь класс типа презентатора (возможно, лучше быть названным контроллером или менеджером).

Этот класс будет POJO, который контролирует поведение вашей службы, которое легко тестируется стандартными junit-тестами и служебными mocks. Этот класс и сервис можно было бы поместить в свой собственный пакет функций и взаимодействовать с задними моделями так же, как и ваши ведущие.

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

Надеюсь, что поможет

+0

Большое вам спасибо, Алекс! Это действительно помогает! :) –

+0

У меня есть только один вопрос. Правильно ли я считаю, что этому классу - Controller должен быть передан контекст (например, для запуска службы), и, следовательно, он будет содержать специфический код для Android? –

+1

В идеале вам не нужно передавать контекст. Поскольку контекст - это код Android, вы хотите сохранить его в службе, чтобы сделать контроллер более простым для тестирования. Не позволяйте Контексу стать объектом Бога;) – MungoRae

1

Я в той же ситуации. В конце концов я решил сделать что-то вроде этого:

деятельности или фрагменты из области видимости, они ничего не знаю о ПМК знаю, но я буду использовать шину событий, как Отто посылать сигналы/события, так:

Мои классы, которые продюсируют своего презентатора, ничего не знают об Android-контексте, но у них будет интерфейс MvpView, только с onAttachPresenter и onDetachPresenter.

Класс, который расширяет Service, будет иметь атрибут Presenter и реализует некоторый интерфейс MvpView с onSucess, onError, onStart, onComplete или что-то в этом роде и те же события для Otto (onSucessEvent, onErrorEvent, onStartEvent, onCompleteEvent).

Поэтому, когда мне нужно что-то сделать, действие или фрагмент запустит службу, служба «начнет» или поговорит с докладчиком, а когда ведущий закончит с успехом, вызовет mvpView.onSuccess() и сохранит информацию внутри локальной БД с SQLite (возможно, storeIO), и, наконец, Служба вызовет Отто и передаст сигнал (без каких-либо данных на нем), возможно, onComplete. Наконец, сигнал будет улавливаться моим пользовательским интерфейсом (возможно, фрагмент) и получить всю информацию внутри БД в SQLite.

Итак, когда происходит onSucess, пользовательский интерфейс отобразит последние и лучшие данные, но если onError произойдет, то (по крайней мере) покажет некоторую информацию (или нет, если хотите), сказав пользователю: «возникла проблема, но, по крайней мере, вы может что-то увидеть », bot onSuccess и onError в конце концов вызовут onComplete.

Не знаю, является ли это лучшим решением, но в этом случае я думаю, что не буду заниматься жизненным циклом деятельности или фрагментов и не заботится о onSaveInstance и восстанавливать данные, когда пользователь поворачивает устройство. Он всегда будет получать последние данные внутри БД, и если что-то произойдет (нет подключения к Интернету), вы можете хотя бы показать что-то, когда получаете сигнал onComplete.

Некоторые факты я до сих пор думаю:

  • Презентатор не будет класс синглтон
  • Presenter ничего не знает о контексте, но да с MyApplication класса
  • Что произойдет, если на одном экране (Фрагмент) у вас есть разные сервисы с разными на SouccessEvents? Просто используйте какое-то действие как идентификатор, чтобы идентифицировать их.
  • Никогда не делайте Activity Fragment реализует MvpView, вам придется иметь дело с жизненным циклом.
+0

Я вижу. Это хорошее решение проблемы. Я решил создать еще один класс под названием Controller, для которого требуется контекст как параметр (мне нужно будет проверить этот класс с roboelectric), и у моего Presenter есть экземпляр этого класса, поэтому он не знает какого-либо конкретного кода для Android, и он может начать услугу и остановить ее :). Что касается живого цикла Презентатора, это не так уж плохо в моем случае. –

+1

Я не знаю, но я не вижу ничего плохого, если фрагмент или действие начинают службу. Android знает андроид, но MVP этого не делает. –

3

Эта статья помогла мне в подобной ситуации, хотя и не может быть точно ваши, идея той же:

https://android.jlelse.eu/android-bound-services-and-mvp-12ca9f70c7c7

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

+0

Спасибо за ваше предложение, Хосе. Обязательно взгляните на статью! :) –

Смежные вопросы