SlideShare a Scribd company logo
1 of 44
Выделение бизнес-
                      логики в сервис
                     Дмитрий Викторович Малыханов
                                DataArt



The Android robot is reproduced or modified from work created and shared by Google and used according to terms described in the
Creative Commons 3.0 Attribution License.
Что, где, когда
       зачем нужны сервисы
Происхождение видов
     какие бывают сервисы
Раз два три четыре пять
       начинаем выполнять
Получите и распишитесь
      доставка результатов
Что, где, когда
зачем и почему нам нужны сервисы
Альтернативы

Просто:                   Service:

● Thread (pool)
  ○ Возврат в UI thread
● AsyncTask
  ○ Последовательно
  ○ Малое время жизни
● Application
                                     ?
  ○ Засорение кучи
  ○ Нет IPC
Альтернативы

Просто:                   Service:

● Thread (pool)
  ○ Возврат в UI thread
● AsyncTask
  ○ Последовательно
  ○ Малое время жизни
● Application
                                     ?
  ○ Засорение кучи
  ○ Нет IPC
Альтернативы

Просто:                   Service:

● Thread (pool)
  ○ Возврат в UI thread
● AsyncTask
  ○ Последовательно
  ○ Малое время жизни
● Application
                                     ?
  ○ Засорение кучи
  ○ Нет IPC
Альтернативы

Просто:                   Service:

● Thread (pool)           ● Thread/Pool/Etc.
  ○ Возврат в UI thread     ○ Гибкое управление
● AsyncTask               ● Wake Locks
  ○ Последовательно         ○ Гарантия CPU
  ○ Малое время жизни     ● Lifetime
● Application               ○ Сам за себя
  ○ Засорение кучи
  ○ Нет IPC
Альтернативы

Просто:                   Service:

● Thread (pool)           ● Thread/Pool/Etc.
  ○ Возврат в UI thread     ○ Гибкое управление
● AsyncTask               ● Wake Locks
  ○ Последовательно         ○ Гарантия CPU
  ○ Малое время жизни     ● Lifetime
● Application               ○ Сам за себя
  ○ Засорение кучи
  ○ Нет IPC
Альтернативы

Просто:                   Service:

● Thread (pool)           ● Thread/Pool/Etc.
  ○ Возврат в UI thread     ○ Гибкое управление
● AsyncTask               ● Wake Locks
  ○ Последовательно         ○ Гарантия CPU
  ○ Малое время жизни     ● Lifetime
● Application               ○ Сам за себя
  ○ Засорение кучи
  ○ Нет IPC
Какова цена?



●   IPC
●   Ресурсы
●   Безопасность
Какова цена?



           ●   IPC
           ●   Ресурсы
           ●   Безопасность
AndroidManifest.xml:

       <service ... android:exported="false" />
Происхождение
        видов
или какие бывают сервисы
Сервисы простейшие

IntentService:


● одна нить
● очередь задач
● жизненный цикл



http://goo.gl/TvtbV
Колония простейших

Две/три задачи параллельно:

<service android:name=".FirstIntentService" />

<service android:name=".SecondIntentService" />

<service android:name=".ThirdIntentService" />
Высокоорганизованные

ExecutorService:

● ThreadPoolExecutor
● Scheduled
   ThreadPoolExecutor



http://goo.gl/mwV90
Контроль: проблема

IntentService           ThreadPoolService

                                ?
Контроль: решение

 startId -> ConcurrentLinkedQueue

                     Запросы: 1, 2, 3, 4, 5
Thread      1           3        4      4       4     idle
Thread      2           2        2      5      idle   idle


Queue    1,2,3,4,5    2,3,4,5   3,4,5   4, 5    5     STOP
Раз два три четыре
           пять
начинаем правильно выполнять
Что и как делаем?

switch (cmdId) {
   case CMD_POLL:
      poll();          Расширение
      break;           функциональности?
   case CMD_UPLOAD:
      upload();
      break;
                  if ("poll".equals(cmd)) {
                     poll();
                  } else if ("upload".equals(cmd)) {
                     upload();
                  }
Независимость

GoF: Command Pattern


interface Command {

    void execute(Context);

}                               4
http://goo.gl/hwFY9
Идентификаторы

public static final int CMD_POLL = 10;
public static final int CMD_UPLOAD = 20;
...




               Command.class.hashCode()

               System.identityHashCode()
Доставка команд

switch (commandId) {
    case CMD_POLL:
        return new PollCommand().execute();
    case CMD_UPLOAD:
        return new UploadCommand().execute();
...


  abstract class Command
      implements Parcelable {

      public abstract void execute(...);
  }
Не все равны

Последовательное выполнение команд:

                 Command.isSerial()

frameworks/base/core/java/android/os/AsyncTask.java:



private static class SerialExecutor
    implements Executor {
...
Получите и
    распишитесь
доставка результатов
Упаковка для данных


    ●   Entity Bean




●       android.os.Bundle
Упаковка для данных


    ●   Entity Bean
          ДА: типизация
            ○

          НЕТ: затраты CPU
            ○

          НЕТ: IPC
            ○



●       android.os.Bundle
        ○ ДА: нет преобразований
        ○ НЕТ: только Parcelable
Упаковка для данных


    ●   Entity Bean
          ДА: типизация
            ○

          НЕТ: затраты CPU
            ○

          НЕТ: IPC
            ○



●       android.os.Bundle
        ○ ДА: нет преобразований
        ○ НЕТ: только Parcelable
Универсальная упаковка



public class EntityBean
         implements Parcelable
{
...




http://goo.gl/QSFPe
Serializable? НЕТ!

Serializable - лучшее из трёх?

         Parcelable
     ^
     С
     к
     о
     р                  5..10 раз
     о
     с
     т
     ь
     ^   Serializable
Билет в один конец

Способ доставки:
  ● broadcast

Проблемы:
  ● IPC
  ● wakelock
  ● жизненный цикл получателя

                      LocalBroadcastManager
http://goo.gl/2h80u
Контейнерная перевозка

Способ доставки:
  ● база данных (provider)

Проблемы:
  ● задержки
  ● "шторм" уведомлений




http://goo.gl/ZPoei
Из рук в руки

Способ доставки:
  ● singleton

Проблемы:
  ● один процесс
  ● расход памяти
  ● связанность



http://goo.gl/yfHPn   http://goo.gl/5AR9h
Заказное письмо

import android.os.ResultReceiver;
  private ResultReceiver receiver =
       new ResultReceiver(handler) {
         ...
       }
...
  new PollCommand(receiver)
       .start(...);

http://goo.gl/rwhw0
Зомби-дилемма

                 Receiver           Sender

 Activity                       Service




                Receiver           Sender
                                             onDestroy
 Activity                      Service




                    Receiver

     Activity
                Receiver            Sender
                                  Sender
                                             onCreate
Activity                       Service
Вечная жизнь
Application
                  Receiver

                                Sender

                             Service

  Activity




Application
                  Receiver

                                Sender

                             Service

  Activity
       Activity
Вечная жизнь: проблемы
Application
              Receiver

                            Sender
                 ?
                         Service

  Activity



                          Garbage
                          Collected
Application
              Receiver

                            Sender

                         Service

  Activity
Жизнь без проблем


Application                               Буфер

              Receiver


                                              Sender




                                    Service




        Activity
Плавность: UI Thread


private ResultReceiver receiver =
  new ResultReceiver(new Handler()) {
    ...
  }


      UI Thread!
Плавность: Background

private Handler handler =
  new Handler(handlerThread);

private ResultReceiver receiver =
  new ResultReceiver(handler) {
    ... onReceive(...) {
       ...
       runOnUiThread(...)
                                  UI
    }
  }
Плавность: всё вместе


private ResultReceiver receiverUi =
  new ResultReceiver(uiThrdHandler) {
    ...
  }

private ResultReceiver receiverBg =
  new ResultReceiver(bgThrdHandler) {
    ...
  }
Всё лучшее вместе
объединение разобщённых
Всё в одном



          GC
                      AIDL Binder

    Queue            get(id)
                 submit(id, command)
    Receiver

                Command
                   Command
Service
Выделение бизнес-
 логики в сервис
Дмитрий Викторович Малыханов

      Вопросы?
Выделение бизнес-
                      логики в сервис




The Android robot is reproduced or modified from work created and shared by Google and used according to terms described in the
Creative Commons 3.0 Attribution License.

More Related Content

What's hot

разработка серверов и серверных приложений лекция №3
разработка серверов и серверных приложений лекция №3разработка серверов и серверных приложений лекция №3
разработка серверов и серверных приложений лекция №3
Eugeniy Tyumentcev
 
Лучшие практики Continuous Delivery с Docker / Дмитрий Столяров (Флант)
Лучшие практики Continuous Delivery с Docker / Дмитрий Столяров (Флант)Лучшие практики Continuous Delivery с Docker / Дмитрий Столяров (Флант)
Лучшие практики Continuous Delivery с Docker / Дмитрий Столяров (Флант)
Ontico
 

What's hot (20)

Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++ Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
 
«Опыт использования каналов в корутинах в боевом проекте» Григорий Федоров
 «Опыт использования каналов в корутинах в боевом проекте»  Григорий Федоров «Опыт использования каналов в корутинах в боевом проекте»  Григорий Федоров
«Опыт использования каналов в корутинах в боевом проекте» Григорий Федоров
 
разработка серверов и серверных приложений лекция №3
разработка серверов и серверных приложений лекция №3разработка серверов и серверных приложений лекция №3
разработка серверов и серверных приложений лекция №3
 
Рецепты RabbitMQ
Рецепты RabbitMQ Рецепты RabbitMQ
Рецепты RabbitMQ
 
Для чего мы делали свой акторный фреймворк и что из этого вышло?
Для чего мы делали свой акторный фреймворк и что из этого вышло?Для чего мы делали свой акторный фреймворк и что из этого вышло?
Для чего мы делали свой акторный фреймворк и что из этого вышло?
 
Алексей Федоров
Алексей ФедоровАлексей Федоров
Алексей Федоров
 
Производительность Unity3D: подводные камни / Алексей Чубарь (BIT.GAMES)
Производительность Unity3D: подводные камни / Алексей Чубарь (BIT.GAMES)Производительность Unity3D: подводные камни / Алексей Чубарь (BIT.GAMES)
Производительность Unity3D: подводные камни / Алексей Чубарь (BIT.GAMES)
 
Модульность и управляемая многопоточность встраиваемых С++ приложений - трудн...
Модульность и управляемая многопоточность встраиваемых С++ приложений - трудн...Модульность и управляемая многопоточность встраиваемых С++ приложений - трудн...
Модульность и управляемая многопоточность встраиваемых С++ приложений - трудн...
 
Антон Полухин, Немного о Boost
Антон Полухин, Немного о BoostАнтон Полухин, Немного о Boost
Антон Полухин, Немного о Boost
 
Unsafe: to be or to be removed?
Unsafe: to be or to be removed?Unsafe: to be or to be removed?
Unsafe: to be or to be removed?
 
Внедрение Docker в процесс разработки демонов. Доклад Константина Карпова на ...
Внедрение Docker в процесс разработки демонов. Доклад Константина Карпова на ...Внедрение Docker в процесс разработки демонов. Доклад Константина Карпова на ...
Внедрение Docker в процесс разработки демонов. Доклад Константина Карпова на ...
 
Очереди и блокировки
Очереди и блокировкиОчереди и блокировки
Очереди и блокировки
 
Лучшие практики Continuous Delivery с Docker / Дмитрий Столяров (Флант)
Лучшие практики Continuous Delivery с Docker / Дмитрий Столяров (Флант)Лучшие практики Continuous Delivery с Docker / Дмитрий Столяров (Флант)
Лучшие практики Continuous Delivery с Docker / Дмитрий Столяров (Флант)
 
How threads help each other
How threads help each otherHow threads help each other
How threads help each other
 
JPoint 2016 - Etudes of DIY Java profiler
JPoint 2016 - Etudes of DIY Java profilerJPoint 2016 - Etudes of DIY Java profiler
JPoint 2016 - Etudes of DIY Java profiler
 
Александр Фокин, Рефлексия в C++
Александр Фокин, Рефлексия в C++Александр Фокин, Рефлексия в C++
Александр Фокин, Рефлексия в C++
 
Борис Сазонов, RAII потоки и CancellationToken в C++
Борис Сазонов, RAII потоки и CancellationToken в C++Борис Сазонов, RAII потоки и CancellationToken в C++
Борис Сазонов, RAII потоки и CancellationToken в C++
 
Артём Ерошенко «Рецепт приготовления облачных тестингов»
Артём Ерошенко «Рецепт приготовления облачных тестингов»Артём Ерошенко «Рецепт приготовления облачных тестингов»
Артём Ерошенко «Рецепт приготовления облачных тестингов»
 
Григорий Демченко — Асинхронное программирование и сопрограммы
Григорий Демченко — Асинхронное программирование и сопрограммыГригорий Демченко — Асинхронное программирование и сопрограммы
Григорий Демченко — Асинхронное программирование и сопрограммы
 
The Great Migration by Baruch Sadogursky
The Great Migration by Baruch SadogurskyThe Great Migration by Baruch Sadogursky
The Great Migration by Baruch Sadogursky
 

Similar to UA Mobile 2012

Vladimir V Perepelitsa Ae Highload
Vladimir V  Perepelitsa Ae HighloadVladimir V  Perepelitsa Ae Highload
Vladimir V Perepelitsa Ae Highload
rit2010
 
Эволюционный дизайн. Joker Students Day 2016
Эволюционный дизайн. Joker Students Day 2016Эволюционный дизайн. Joker Students Day 2016
Эволюционный дизайн. Joker Students Day 2016
Кирилл Толкачёв
 
Rempl — крутая платформа для крутых инструментов - Роман Дворнов (Avito)
Rempl — крутая платформа для крутых инструментов - Роман Дворнов (Avito)Rempl — крутая платформа для крутых инструментов - Роман Дворнов (Avito)
Rempl — крутая платформа для крутых инструментов - Роман Дворнов (Avito)
AvitoTech
 

Similar to UA Mobile 2012 (20)

Vladimir V Perepelitsa Ae Highload
Vladimir V  Perepelitsa Ae HighloadVladimir V  Perepelitsa Ae Highload
Vladimir V Perepelitsa Ae Highload
 
Организация процесса регулярной обработки больших объемов данных
Организация процесса регулярной обработки больших объемов данныхОрганизация процесса регулярной обработки больших объемов данных
Организация процесса регулярной обработки больших объемов данных
 
Zacepin
ZacepinZacepin
Zacepin
 
Asynchrony and coroutines
Asynchrony and coroutinesAsynchrony and coroutines
Asynchrony and coroutines
 
ВВЕДЕНИЕ В NODE.JS
ВВЕДЕНИЕ В NODE.JS ВВЕДЕНИЕ В NODE.JS
ВВЕДЕНИЕ В NODE.JS
 
IT-инфраструктура. FAQ для разработчика
IT-инфраструктура. FAQ для разработчикаIT-инфраструктура. FAQ для разработчика
IT-инфраструктура. FAQ для разработчика
 
SECON'2016. Чубарь Алексей, Мобильные грабли Unity
SECON'2016. Чубарь Алексей, Мобильные грабли UnitySECON'2016. Чубарь Алексей, Мобильные грабли Unity
SECON'2016. Чубарь Алексей, Мобильные грабли Unity
 
Эволюционный дизайн. Joker Students Day 2016
Эволюционный дизайн. Joker Students Day 2016Эволюционный дизайн. Joker Students Day 2016
Эволюционный дизайн. Joker Students Day 2016
 
Ловля сетями. Инструменты отладки сетевых запросов приложений / Дмитрий Рыбак...
Ловля сетями. Инструменты отладки сетевых запросов приложений / Дмитрий Рыбак...Ловля сетями. Инструменты отладки сетевых запросов приложений / Дмитрий Рыбак...
Ловля сетями. Инструменты отладки сетевых запросов приложений / Дмитрий Рыбак...
 
Rempl — крутая платформа для крутых инструментов - Роман Дворнов (Avito)
Rempl — крутая платформа для крутых инструментов - Роман Дворнов (Avito)Rempl — крутая платформа для крутых инструментов - Роман Дворнов (Avito)
Rempl — крутая платформа для крутых инструментов - Роман Дворнов (Avito)
 
Асинхронность и сопрограммы
Асинхронность и сопрограммыАсинхронность и сопрограммы
Асинхронность и сопрограммы
 
Design Principles
Design PrinciplesDesign Principles
Design Principles
 
GitLab, Prometheus и Grafana с Kubernetes
GitLab, Prometheus и Grafana с KubernetesGitLab, Prometheus и Grafana с Kubernetes
GitLab, Prometheus и Grafana с Kubernetes
 
Сенцов Сергей "Приемы оптимизаций Desktop приложений"
Сенцов Сергей "Приемы оптимизаций Desktop приложений"Сенцов Сергей "Приемы оптимизаций Desktop приложений"
Сенцов Сергей "Приемы оптимизаций Desktop приложений"
 
Mobile Fest#spb 2012
Mobile Fest#spb 2012Mobile Fest#spb 2012
Mobile Fest#spb 2012
 
Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)
Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)
Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)
 
Превышаем скоростные лимиты с Angular 2
Превышаем скоростные лимиты с Angular 2Превышаем скоростные лимиты с Angular 2
Превышаем скоростные лимиты с Angular 2
 
Docker в Badoo: ПМЖ или временная регистрация
Docker в Badoo: ПМЖ или временная регистрацияDocker в Badoo: ПМЖ или временная регистрация
Docker в Badoo: ПМЖ или временная регистрация
 
Docker integration into Badoo
Docker integration into BadooDocker integration into Badoo
Docker integration into Badoo
 
Управление памятью в CPython
Управление памятью в CPythonУправление памятью в CPython
Управление памятью в CPython
 

UA Mobile 2012