Saturday, August 25, 2012

Service vs. IntentService

Согласно документации Service - это компонент, который предназначен для выполнения длительных операций в фоновом режиме и при необходимости предоставляющий функциональность другим приложениям. Мы сейчас не будем рассматривать как написать свою реализацию, а поговорим немного о другом. Те кто не любит читать документацию, могут и не догадываться об одной важной детали. Service выполняется в главном потоке приложения(как и все компоненты), а это в свою очередь значит, что он косвенно влияет на производительность в целом. Т.е. если мы будем выполнять операции, которые требуют много процессорного времени(декодирование видео/аудио) или блокирующие операции(взаимодействие с сетью), то рано или поздно мы столкнемся с ANR(Application Not Responding). Та же документация предлагает два возможных варианта, решения вышеописанной проблемы: запуск отдельного потока или вместо базового класса Service использовать IntentService.

IntentService - компонент, который так же выполняет разного рода операции(запросы в виде intent-ов), но только по требованию и асинхронно. Сервис имеет внутреннюю очередь запросов. В отдельный момент времени обрабатывается только один запрос причем на все про все создается только одни рабочий поток(а не отдельный поток для каждого запроса). Как только все запросы были выполнены, сервис останавливается. Резюмируя, имеем следующие различия:

  • Serivece использует главный поток приложения в то время как IntentService - отдельный
  • IntentServie имеет внутреннюю очередь. В отдельный момент времени выполняется только один запрос. Если мы хотим реализовать псевдопараллельное выполнение запросов, то нужно отнаследоваться от Serivice и создавать отдельный поток для каждого запроса(что не есть хорошо :))
  • IntentService останавливается автоматически после выполнения всех задач(после очищения очереди), в то время как жизненным циклом Service-а нам нужно управлять "вручную", использовать метод stopSelf() для остановки
  • Метод onBind() в IntentService возвращает null, что значит, что по умолчанию  нет связанного компонента. Оно и понятно, принимая в расчет природу IntentService(асинхронность). Для обратной связи, как правило, используются совсем другие механизмы

2 comments:

  1. "Для обратной связи, как правило, используются совсем другие механизмы" - подскажите примеры этих механизмов.

    ReplyDelete
    Replies
    1. Каждый случай индивидуален, в том смысле, что нет универсальных решений. Но чаще обычного используется android.os.Messenger. Пример можно глянуть тут http://androidyou.blogspot.com/2011/04/android-intentservice-how-to-write.html

      Delete