Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
Выделение бизнес-                      логики в сервис                     Дмитрий Викторович Малыханов                   ...
Что, где, когда       зачем нужны сервисыПроисхождение видов     какие бывают сервисыРаз два три четыре пять       начинае...
Что, где, когдазачем и почему нам нужны сервисы
АльтернативыПросто:                   Service:● Thread (pool)  ○ Возврат в UI thread● AsyncTask  ○ Последовательно  ○ Мало...
АльтернативыПросто:                   Service:● Thread (pool)  ○ Возврат в UI thread● AsyncTask  ○ Последовательно  ○ Мало...
АльтернативыПросто:                   Service:● Thread (pool)  ○ Возврат в UI thread● AsyncTask  ○ Последовательно  ○ Мало...
АльтернативыПросто:                   Service:● Thread (pool)           ● Thread/Pool/Etc.  ○ Возврат в UI thread     ○ Ги...
АльтернативыПросто:                   Service:● Thread (pool)           ● Thread/Pool/Etc.  ○ Возврат в UI thread     ○ Ги...
АльтернативыПросто:                   Service:● Thread (pool)           ● Thread/Pool/Etc.  ○ Возврат в UI thread     ○ Ги...
Какова цена?●   IPC●   Ресурсы●   Безопасность
Какова цена?           ●   IPC           ●   Ресурсы           ●   БезопасностьAndroidManifest.xml:       <service ... and...
Происхождение        видовили какие бывают сервисы
Сервисы простейшиеIntentService:● одна нить● очередь задач● жизненный циклhttp://goo.gl/TvtbV
Колония простейшихДве/три задачи параллельно:<service android:name=".FirstIntentService" /><service android:name=".SecondI...
ВысокоорганизованныеExecutorService:● ThreadPoolExecutor● Scheduled   ThreadPoolExecutorhttp://goo.gl/mwV90
Контроль: проблемаIntentService           ThreadPoolService                                ?
Контроль: решение startId -> ConcurrentLinkedQueue                     Запросы: 1, 2, 3, 4, 5Thread      1           3    ...
Раз два три четыре           пятьначинаем правильно выполнять
Что и как делаем?switch (cmdId) {   case CMD_POLL:      poll();          Расширение      break;           функциональности...
НезависимостьGoF: Command Patterninterface Command {    void execute(Context);}                               4http://goo....
Идентификаторыpublic static final int CMD_POLL = 10;public static final int CMD_UPLOAD = 20;...               Command.clas...
Доставка командswitch (commandId) {    case CMD_POLL:        return new PollCommand().execute();    case CMD_UPLOAD:      ...
Не все равныПоследовательное выполнение команд:                 Command.isSerial()frameworks/base/core/java/android/os/Asy...
Получите и    распишитесьдоставка результатов
Упаковка для данных    ●   Entity Bean●       android.os.Bundle
Упаковка для данных    ●   Entity Bean          ДА: типизация            ○          НЕТ: затраты CPU            ○         ...
Упаковка для данных    ●   Entity Bean          ДА: типизация            ○          НЕТ: затраты CPU            ○         ...
Универсальная упаковкаpublic class EntityBean         implements Parcelable{...http://goo.gl/QSFPe
Serializable? НЕТ!Serializable - лучшее из трёх?         Parcelable     ^     С     к     о     р                  5..10 р...
Билет в один конецСпособ доставки:  ● broadcastПроблемы:  ● IPC  ● wakelock  ● жизненный цикл получателя                  ...
Контейнерная перевозкаСпособ доставки:  ● база данных (provider)Проблемы:  ● задержки  ● "шторм" уведомленийhttp://goo.gl/...
Из рук в рукиСпособ доставки:  ● singletonПроблемы:  ● один процесс  ● расход памяти  ● связанностьhttp://goo.gl/yfHPn   h...
Заказное письмоimport android.os.ResultReceiver;  private ResultReceiver receiver =       new ResultReceiver(handler) {   ...
Зомби-дилемма                 Receiver           Sender Activity                       Service                Receiver    ...
Вечная жизньApplication                  Receiver                                Sender                             Servic...
Вечная жизнь: проблемыApplication              Receiver                            Sender                 ?               ...
Жизнь без проблемApplication                               Буфер              Receiver                                    ...
Плавность: UI Threadprivate ResultReceiver receiver =  new ResultReceiver(new Handler()) {    ...  }      UI Thread!
Плавность: Backgroundprivate Handler handler =  new Handler(handlerThread);private ResultReceiver receiver =  new ResultRe...
Плавность: всё вместеprivate ResultReceiver receiverUi =  new ResultReceiver(uiThrdHandler) {    ...  }private ResultRecei...
Всё лучшее вместеобъединение разобщённых
Всё в одном          GC                      AIDL Binder    Queue            get(id)                 submit(id, command)  ...
Выделение бизнес- логики в сервисДмитрий Викторович Малыханов      Вопросы?
Выделение бизнес-                      логики в сервисThe Android robot is reproduced or modified from work created and sh...
Upcoming SlideShare
Loading in …5
×

UA Mobile 2012

641 views

Published on

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

  • Be the first to comment

  • Be the first to like this

UA Mobile 2012

  1. 1. Выделение бизнес- логики в сервис Дмитрий Викторович Малыханов DataArtThe Android robot is reproduced or modified from work created and shared by Google and used according to terms described in theCreative Commons 3.0 Attribution License.
  2. 2. Что, где, когда зачем нужны сервисыПроисхождение видов какие бывают сервисыРаз два три четыре пять начинаем выполнятьПолучите и распишитесь доставка результатов
  3. 3. Что, где, когдазачем и почему нам нужны сервисы
  4. 4. АльтернативыПросто: Service:● Thread (pool) ○ Возврат в UI thread● AsyncTask ○ Последовательно ○ Малое время жизни● Application ? ○ Засорение кучи ○ Нет IPC
  5. 5. АльтернативыПросто: Service:● Thread (pool) ○ Возврат в UI thread● AsyncTask ○ Последовательно ○ Малое время жизни● Application ? ○ Засорение кучи ○ Нет IPC
  6. 6. АльтернативыПросто: Service:● Thread (pool) ○ Возврат в UI thread● AsyncTask ○ Последовательно ○ Малое время жизни● Application ? ○ Засорение кучи ○ Нет IPC
  7. 7. АльтернативыПросто: Service:● Thread (pool) ● Thread/Pool/Etc. ○ Возврат в UI thread ○ Гибкое управление● AsyncTask ● Wake Locks ○ Последовательно ○ Гарантия CPU ○ Малое время жизни ● Lifetime● Application ○ Сам за себя ○ Засорение кучи ○ Нет IPC
  8. 8. АльтернативыПросто: Service:● Thread (pool) ● Thread/Pool/Etc. ○ Возврат в UI thread ○ Гибкое управление● AsyncTask ● Wake Locks ○ Последовательно ○ Гарантия CPU ○ Малое время жизни ● Lifetime● Application ○ Сам за себя ○ Засорение кучи ○ Нет IPC
  9. 9. АльтернативыПросто: Service:● Thread (pool) ● Thread/Pool/Etc. ○ Возврат в UI thread ○ Гибкое управление● AsyncTask ● Wake Locks ○ Последовательно ○ Гарантия CPU ○ Малое время жизни ● Lifetime● Application ○ Сам за себя ○ Засорение кучи ○ Нет IPC
  10. 10. Какова цена?● IPC● Ресурсы● Безопасность
  11. 11. Какова цена? ● IPC ● Ресурсы ● БезопасностьAndroidManifest.xml: <service ... android:exported="false" />
  12. 12. Происхождение видовили какие бывают сервисы
  13. 13. Сервисы простейшиеIntentService:● одна нить● очередь задач● жизненный циклhttp://goo.gl/TvtbV
  14. 14. Колония простейшихДве/три задачи параллельно:<service android:name=".FirstIntentService" /><service android:name=".SecondIntentService" /><service android:name=".ThirdIntentService" />
  15. 15. ВысокоорганизованныеExecutorService:● ThreadPoolExecutor● Scheduled ThreadPoolExecutorhttp://goo.gl/mwV90
  16. 16. Контроль: проблемаIntentService ThreadPoolService ?
  17. 17. Контроль: решение startId -> ConcurrentLinkedQueue Запросы: 1, 2, 3, 4, 5Thread 1 3 4 4 4 idleThread 2 2 2 5 idle idleQueue 1,2,3,4,5 2,3,4,5 3,4,5 4, 5 5 STOP
  18. 18. Раз два три четыре пятьначинаем правильно выполнять
  19. 19. Что и как делаем?switch (cmdId) { case CMD_POLL: poll(); Расширение break; функциональности? case CMD_UPLOAD: upload(); break; if ("poll".equals(cmd)) { poll(); } else if ("upload".equals(cmd)) { upload(); }
  20. 20. НезависимостьGoF: Command Patterninterface Command { void execute(Context);} 4http://goo.gl/hwFY9
  21. 21. Идентификаторыpublic static final int CMD_POLL = 10;public static final int CMD_UPLOAD = 20;... Command.class.hashCode() System.identityHashCode()
  22. 22. Доставка команд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(...); }
  23. 23. Не все равныПоследовательное выполнение команд: Command.isSerial()frameworks/base/core/java/android/os/AsyncTask.java:private static class SerialExecutor implements Executor {...
  24. 24. Получите и распишитесьдоставка результатов
  25. 25. Упаковка для данных ● Entity Bean● android.os.Bundle
  26. 26. Упаковка для данных ● Entity Bean ДА: типизация ○ НЕТ: затраты CPU ○ НЕТ: IPC ○● android.os.Bundle ○ ДА: нет преобразований ○ НЕТ: только Parcelable
  27. 27. Упаковка для данных ● Entity Bean ДА: типизация ○ НЕТ: затраты CPU ○ НЕТ: IPC ○● android.os.Bundle ○ ДА: нет преобразований ○ НЕТ: только Parcelable
  28. 28. Универсальная упаковкаpublic class EntityBean implements Parcelable{...http://goo.gl/QSFPe
  29. 29. Serializable? НЕТ!Serializable - лучшее из трёх? Parcelable ^ С к о р 5..10 раз о с т ь ^ Serializable
  30. 30. Билет в один конецСпособ доставки: ● broadcastПроблемы: ● IPC ● wakelock ● жизненный цикл получателя LocalBroadcastManagerhttp://goo.gl/2h80u
  31. 31. Контейнерная перевозкаСпособ доставки: ● база данных (provider)Проблемы: ● задержки ● "шторм" уведомленийhttp://goo.gl/ZPoei
  32. 32. Из рук в рукиСпособ доставки: ● singletonПроблемы: ● один процесс ● расход памяти ● связанностьhttp://goo.gl/yfHPn http://goo.gl/5AR9h
  33. 33. Заказное письмоimport android.os.ResultReceiver; private ResultReceiver receiver = new ResultReceiver(handler) { ... }... new PollCommand(receiver) .start(...);http://goo.gl/rwhw0
  34. 34. Зомби-дилемма Receiver Sender Activity Service Receiver Sender onDestroy Activity Service Receiver Activity Receiver Sender Sender onCreateActivity Service
  35. 35. Вечная жизньApplication Receiver Sender Service ActivityApplication Receiver Sender Service Activity Activity
  36. 36. Вечная жизнь: проблемыApplication Receiver Sender ? Service Activity Garbage CollectedApplication Receiver Sender Service Activity
  37. 37. Жизнь без проблемApplication Буфер Receiver Sender Service Activity
  38. 38. Плавность: UI Threadprivate ResultReceiver receiver = new ResultReceiver(new Handler()) { ... } UI Thread!
  39. 39. Плавность: Backgroundprivate Handler handler = new Handler(handlerThread);private ResultReceiver receiver = new ResultReceiver(handler) { ... onReceive(...) { ... runOnUiThread(...) UI } }
  40. 40. Плавность: всё вместеprivate ResultReceiver receiverUi = new ResultReceiver(uiThrdHandler) { ... }private ResultReceiver receiverBg = new ResultReceiver(bgThrdHandler) { ... }
  41. 41. Всё лучшее вместеобъединение разобщённых
  42. 42. Всё в одном GC AIDL Binder Queue get(id) submit(id, command) Receiver Command CommandService
  43. 43. Выделение бизнес- логики в сервисДмитрий Викторович Малыханов Вопросы?
  44. 44. Выделение бизнес- логики в сервисThe Android robot is reproduced or modified from work created and shared by Google and used according to terms described in theCreative Commons 3.0 Attribution License.

×