IntentService или как лучше разделить логику и UI?

Приветствую.


Сейчас рассматриваю и пытаюсь вывести более вменяемый патерн для разделения сервиса, логики и UI + мосты (каллбэки) между ними.


Хотел посоветоваться, что думаете над таким патерном или что можно улучшить?


1. Обработчик логики выводится в IntentService

2. В onHandleIntent вызываем/создаем нужные объекты или функции для обработки intent'а

3. Результат обработки уходит в Bundle

4. Входящий intent в onHandleIntent всегда (ну почти) имеет receiver: ResultReceiver

5. В конце обработки говорим receiver.send = RESULT_CODE с результатом обработки (Bundle)


Старт IntentService происходит через регистрацию специального action'а (где-то константа в виде String) в AndroidManifest.xml и вызова в другом месте кода startService( наш action + Intent с данными запроса + ResultReceiver опционально )


Конечно вопрос еще в том, что случится если Pause/Resume на Activity. Тут нужно что-то вроде register/unregister callback. Вчера был в Google, как раз предлагали там, завести static лист listeners, ну в общем реализовать паттерн observer, но я не сильно охотно хочу привязываться к классу сервиса.


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

UPD:

Обнаружил, что можно использовать UI thread Handler как мост между всей очередью Messages. Собственно создать в основном потоке Handler не проблема, а потом просто слать Message и тот Handler с Handler.Callback, который обработает message, и будет callback. Но все же я еще думаю.
  • Вопрос задан
  • 4674 просмотра
Пригласить эксперта
Ответы на вопрос 3
Судя по описанию, вам Наблюдатель и нужен. Можно посмотреть на сигналы-слоты в Qt (как раз одна из реализаций плагина Observer).
Ответ написан
Комментировать
ilichme
@ilichme
Автор, я тоже это проходил. Мне хотелось, чтобы логика была за неким фасадом, и классы, её реализующие, существовали на протяжении всей работы приложения. А активити цеплялись к к ним по мере создания. Подход себя не оправдал, так как синглтоны — зло, а передача данных из сервиса осуществляется через Bundle, что вносит некоторые ограничения. А если в Bundle передавать ResponseHandler, то плодятся синглтоны…
Поэтому я сейчас использую для сложных проектов разновидность MVP, где View — xml + activity с минимальным кодом, а уже в активити создаются Presenter и Model. в презентере логика, а в модели — доступ к данным — сервисы и контент-провайдры. Фасада, как такового, нет.
Ответ написан
evilduck
@evilduck
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы