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.

mDevCamp - Android a práce na pozadí

1,577 views

Published on

Android API pro práci na pozadí je bohaté, nabízí věci jako AsyncTask, IntentService, Handler. Oficiální i neoficiální dokumentace je ale na vysvětlování jejich používání trochu skoupá. V přednášce identifikujeme nejpoužívanější use-cases práce na pozadí a ukážeme si několik možností, jak je správně řešit. Začneme skrytými záludnostmi použití AsyncTasku, přejdeme na synchronizaci dat z a na server a na konci se zastavíme u Service. Přednáška je určena všem Android vývojářům.

Published in: Technology
  • Be the first to comment

mDevCamp - Android a práce na pozadí

  1. 1. Android a práce na pozadí Ondra Zahradník mDevCamp - 26.5.2012
  2. 2. Agenda
  3. 3. Agenda•Motivace
  4. 4. Agenda•Motivace•Use-cases
  5. 5. Agenda•Motivace•Use-cases•Diskuze
  6. 6. Motivace - bohaté API
  7. 7. Motivace - bohaté API•Spousta nástrojů
  8. 8. Motivace - bohaté API•Spousta nástrojů •Handler, AsyncTask, Service,
  9. 9. Motivace - bohaté API•Spousta nástrojů •Handler, AsyncTask, Service, •AsyncQueryLoader, Loader,
  10. 10. Motivace - bohaté API•Spousta nástrojů •Handler, AsyncTask, Service, •AsyncQueryLoader, Loader, •Worker Fragment,...
  11. 11. Motivace - bohaté API•Spousta nástrojů •Handler, AsyncTask, Service, •AsyncQueryLoader, Loader, •Worker Fragment,...•Málo dokumentace s best-practices
  12. 12. Motivace - bohaté API•Spousta nástrojů •Handler, AsyncTask, Service, •AsyncQueryLoader, Loader, •Worker Fragment,...•Málo dokumentace s best-practices•Spousta nekvalitních apps
  13. 13. Motivace -rychlé appky
  14. 14. Motivace -rychlé appky•Nechceme čekat, když čekáme
  15. 15. Motivace -rychlé appky•Nechceme čekat, když čekáme•Chceme rychlé appky
  16. 16. Motivace -rychlé appky•Nechceme čekat, když čekáme•Chceme rychlé appky 1.síťovat, když se nikdo nedívá
  17. 17. Motivace -rychlé appky•Nechceme čekat, když čekáme•Chceme rychlé appky 1.síťovat, když se nikdo nedívá 2.provádět akce okamžitě
  18. 18. Motivace -rychlé appky•Nechceme čekat, když čekáme•Chceme rychlé appky 1.síťovat, když se nikdo nedívá 2.provádět akce okamžitě 3.prioritizovat tasky
  19. 19. Příklad - Corkbin pro iOS a Android
  20. 20. Příklad - Corkbin pro iOS a Android
  21. 21. Příklad - Corkbin pro iOS a Android
  22. 22. Příklad - Corkbin pro iOS a Android
  23. 23. Příklad - Corkbin pro iOS a Android
  24. 24. Příklad - Corkbin pro iOS a Android
  25. 25. Příklad - Corkbin pro iOS a Android
  26. 26. Příklad - Corkbin pro iOS a Android
  27. 27. Příklad - Corkbin pro iOS a Android
  28. 28. Příklad - Corkbin pro iOS a Android
  29. 29. Příklad - Corkbin pro iOS a Android
  30. 30. Omezený programovací model
  31. 31. Omezený programovací model•Slabý procesor
  32. 32. Omezený programovací model•Slabý procesor•Opravdový multi-tasking
  33. 33. Omezený programovací model•Slabý procesor•Opravdový multi-tasking•“Application not responding” aka. ANR
  34. 34. Omezený programovací model•Slabý procesor•Opravdový multi-tasking•“Application not responding” aka. ANR•Aktualizace UI pouze v ui threadu
  35. 35. Omezený programovací model•Slabý procesor•Opravdový multi-tasking•“Application not responding” aka. ANR•Aktualizace UI pouze v ui threadu•UI žije jenom chvíli
  36. 36. Use-cases
  37. 37. Use-cases• Znovuobjevení AsyncTasku
  38. 38. Use-cases• Znovuobjevení AsyncTasku• Stažení dat ze serveru
  39. 39. Use-cases• Znovuobjevení AsyncTasku• Stažení dat ze serveru• Aktualizace modelu
  40. 40. Use-cases• Znovuobjevení AsyncTasku• Stažení dat ze serveru• Aktualizace modelu• Progress dialog
  41. 41. Use-cases• Znovuobjevení AsyncTasku• Stažení dat ze serveru• Aktualizace modelu• Progress dialog• Dlouhotrvající úlohy
  42. 42. Nástroje
  43. 43. Nástroje•AsyncTask – jednorázové operace
  44. 44. Nástroje•AsyncTask – jednorázové operace•Loader – načítání dat pro view
  45. 45. Nástroje•AsyncTask – jednorázové operace•Loader – načítání dat pro view•AsyncQueryHandler – operace delete, update, create
  46. 46. Nástroje•AsyncTask – jednorázové operace•Loader – načítání dat pro view•AsyncQueryHandler – operace delete, update, create•IntentService – jednorázově na pozadí bez UI
  47. 47. Nástroje•AsyncTask – jednorázové operace•Loader – načítání dat pro view•AsyncQueryHandler – operace delete, update, create•IntentService – jednorázově na pozadí bez UI•Service – na pozadí s UI
  48. 48. Nástroje•AsyncTask – jednorázové operace•Loader – načítání dat pro view•AsyncQueryHandler – operace delete, update, create•IntentService – jednorázově na pozadí bez UI•Service – na pozadí s UI•Handler, HandlerThread – fronta úloh
  49. 49. Nástroje•AsyncTask – jednorázové operace•Loader – načítání dat pro view•AsyncQueryHandler – operace delete, update, create•IntentService – jednorázově na pozadí bez UI•Service – na pozadí s UI•Handler, HandlerThread – fronta úloh•Thread, ThreadPoolExecutor – komplexní
  50. 50. Znovuobjevení AsyncTasku
  51. 51. Znovuobjevení AsyncTasku•UI -> práce na pozadí -> aktualizace UI
  52. 52. Znovuobjevení AsyncTasku•UI -> práce na pozadí -> aktualizace UI•UI může skončit kdykoliv
  53. 53. Znovuobjevení AsyncTasku•UI -> práce na pozadí -> aktualizace UI•UI může skončit kdykoliv•AsyncTask jako anonymní třída - drží Context
  54. 54. Znovuobjevení AsyncTasku•UI -> práce na pozadí -> aktualizace UI•UI může skončit kdykoliv•AsyncTask jako anonymní třída - drží Context
  55. 55. Znovuobjevení AsyncTasku•UI -> práce na pozadí -> aktualizace UI•UI může skončit kdykoliv•AsyncTask jako anonymní třída - drží Context
  56. 56. Znovuobjevení AsyncTasku•UI -> práce na pozadí -> aktualizace UI•UI může skončit kdykoliv•AsyncTask jako anonymní třída - drží Context
  57. 57. Znovuobjevení AsyncTasku•UI -> práce na pozadí -> aktualizace UI•UI může skončit kdykoliv•AsyncTask jako anonymní třída - drží Context
  58. 58. Znovuobjevení AsyncTasku
  59. 59. Znovuobjevení AsyncTasku
  60. 60. Znovuobjevení AsyncTasku•Lepší je worker fragment - setRetainInstance()
  61. 61. Stažení dat ze serveru
  62. 62. Stažení dat ze serveru•“Ukaž něco a pak aktualizuj”
  63. 63. Stažení dat ze serveru•“Ukaž něco a pak aktualizuj”•Cachovaná, aktualizovaná read-only data
  64. 64. Stažení dat ze serveru•“Ukaž něco a pak aktualizuj”•Cachovaná, aktualizovaná read-only data•Cachovat HTTP response
  65. 65. Stažení dat ze serveru•“Ukaž něco a pak aktualizuj”•Cachovaná, aktualizovaná read-only data•Cachovat HTTP response•AsyncLoader
  66. 66. Stažení dat ze serveru•“Ukaž něco a pak aktualizuj”•Cachovaná, aktualizovaná read-only data•Cachovat HTTP response•AsyncLoader•URLConnection
  67. 67. Stažení dat ze serveru•“Ukaž něco a pak aktualizuj”•Cachovaná, aktualizovaná read-only data•Cachovat HTTP response•AsyncLoader•URLConnection•HttpResponseCache - od v13
  68. 68. Stažení dat ze serveru•“Ukaž něco a pak aktualizuj”•Cachovaná, aktualizovaná read-only data•Cachovat HTTP response•AsyncLoader•URLConnection•HttpResponseCache - od v13•DiskLRUCache
  69. 69. Stažení dat ze serveru
  70. 70. Stažení dat ze serveru Fragment zobrazí data AsyncLoader
  71. 71. Stažení dat ze serveru Fragment zobrazí data AsyncLoader poskytuje data Disková cache
  72. 72. Stažení dat ze serveru vyvolá refresh Fragment zobrazí data AsyncLoader AsyncLoader poskytuje data Disková cache
  73. 73. Stažení dat ze serveru vyvolá refresh Fragment zobrazí data zobrazí data AsyncLoader AsyncLoader poskytuje data Disková cache
  74. 74. Stažení dat ze serveru vyvolá refresh Fragment zobrazí data zobrazí data AsyncLoader AsyncLoader poskytuje data aktualizuje Disková cache cache
  75. 75. Stažení dat ze serveru 2
  76. 76. Stažení dat ze serveru 2•Model v DB
  77. 77. Stažení dat ze serveru 2•Model v DB•Sync přes IntentService
  78. 78. Stažení dat ze serveru 2•Model v DB•Sync přes IntentService•Přístup k modelu přes ContentProvider
  79. 79. Stažení dat ze serveru 2•Model v DB•Sync přes IntentService•Přístup k modelu přes ContentProvider •REST-like api
  80. 80. Stažení dat ze serveru 2•Model v DB•Sync přes IntentService•Přístup k modelu přes ContentProvider •REST-like api•UI přes CursorLoader
  81. 81. Stažení dat ze serveru 2•Model v DB•Sync přes IntentService•Přístup k modelu přes ContentProvider •REST-like api•UI přes CursorLoader•Alternativně: SyncAdapter
  82. 82. Stažení dat ze serveru 2 Fragment načítání dat CursorLoader
  83. 83. Stažení dat ze serveru 2 Fragment načítání dat CursorLoader poskytuje data ContentProvider
  84. 84. Stažení dat ze serveru 2 Fragment načítání dat CursorLoader poskytuje data čte data ContentProvider DB
  85. 85. Stažení dat ze serveru 2 vyvolá refresh Fragment načítání dat CursorLoader IntentService poskytuje data čte data ContentProvider DB
  86. 86. Stažení dat ze serveru 2 vyvolá refresh Fragment načítání dat CursorLoader IntentService poskytuje aktualizuje data data čte data ContentProvider DB
  87. 87. Stažení dat ze serveru 2 vyvolá refresh Fragment načítání dat notifikuje uri CursorLoader IntentService poskytuje aktualizuje data data čte data ContentProvider DB
  88. 88. Aktualizace modelu
  89. 89. Aktualizace modelu•Neblokovat UI, model v DB
  90. 90. Aktualizace modelu•Neblokovat UI, model v DB•V modelu stav synchronizace se serverem
  91. 91. Aktualizace modelu•Neblokovat UI, model v DB•V modelu stav synchronizace se serverem •flagy Status a Transaction/poslední změna
  92. 92. Aktualizace modelu•Neblokovat UI, model v DB•V modelu stav synchronizace se serverem •flagy Status a Transaction/poslední změna •propagace chyb a stavu do UI
  93. 93. Aktualizace modelu•Neblokovat UI, model v DB•V modelu stav synchronizace se serverem •flagy Status a Transaction/poslední změna •propagace chyb a stavu do UI•Lokální update přes AsyncQueryHandler
  94. 94. Aktualizace modelu•Neblokovat UI, model v DB•V modelu stav synchronizace se serverem •flagy Status a Transaction/poslední změna •propagace chyb a stavu do UI•Lokální update přes AsyncQueryHandler •použít WeakReference v callbacku
  95. 95. Aktualizace modelu•Neblokovat UI, model v DB•V modelu stav synchronizace se serverem •flagy Status a Transaction/poslední změna •propagace chyb a stavu do UI•Lokální update přes AsyncQueryHandler •použít WeakReference v callbacku•Synchronizace přes IntentService
  96. 96. Aktualizace modelu
  97. 97. Aktualizace modelu Fragmentnačítání dat poskytuje data CursorLoader ContentProvider
  98. 98. Aktualizace modelu update, create, delete AsyncQueryHandle Fragment rnačítání dat poskytuje data CursorLoader ContentProvider
  99. 99. Aktualizace modelu update, create, delete AsyncQueryHandle Fragment r volánačítání dat provider poskytuje data CursorLoader ContentProvider
  100. 100. Aktualizace modelu update, create, delete AsyncQueryHandle Fragment r volánačítání dat provider poskytuje data CursorLoader ContentProvider mění data DB
  101. 101. Aktualizace modelu update, create, delete AsyncQueryHandle Fragment r volánačítání dat provider poskytuje data CursorLoader notifikuje ContentProvider akci mění data DB
  102. 102. Aktualizace modelu update, create, delete AsyncQueryHandle Fragment r volánačítání dat provider poskytuje data CursorLoader notifikuje ContentProvider akci volá sync mění data IntentService DB
  103. 103. Aktualizace modelu update, create, delete AsyncQueryHandle Fragment r volánačítání dat provider poskytuje data CursorLoader notifikuje ContentProvider akci volá sync mění data aktualizuje IntentService data DB
  104. 104. Aktualizace modelu update, create, delete AsyncQueryHandle Fragment r volánačítání dat provider poskytuje data CursorLoader notifikuje ContentProvider akci volá sync notifikuj mění data e aktualizuje IntentService data DB
  105. 105. Progress dialog
  106. 106. Progress dialog
  107. 107. Progress dialogBlokuje UI dokud neskončídůležitá operace
  108. 108. Progress dialogBlokuje UI dokud neskončídůležitá operacePřežije změny konfigurace
  109. 109. Progress dialogBlokuje UI dokud neskončídůležitá operacePřežije změny konfiguraceLze ho stornovat
  110. 110. Progress dialogBlokuje UI dokud neskončídůležitá operacePřežije změny konfiguraceLze ho stornovatRealizace přesDialogFragment aAsyncTask
  111. 111. Progress dialog
  112. 112. Progress dialog
  113. 113. Progress dialog
  114. 114. Progress dialog
  115. 115. Progress dialog
  116. 116. Progress dialog
  117. 117. Progress dialog
  118. 118. Dlouhotrvající úlohy
  119. 119. Dlouhotrvající úlohy
  120. 120. Dlouhotrvající úlohyService s worker threadem
  121. 121. Dlouhotrvající úlohyService s worker threademUI pro ovládání bindujeservice
  122. 122. Dlouhotrvající úlohyService s worker threademUI pro ovládání bindujeserviceUI je typicky několik
  123. 123. Dlouhotrvající úlohyService s worker threademUI pro ovládání bindujeserviceUI je typicky několikNotifikace přes callback amodel
  124. 124. Dlouhotrvající úlohy
  125. 125. Dlouhotrvající úlohy
  126. 126. Dlouhotrvající úlohy
  127. 127. Dlouhotrvající úlohy
  128. 128. Dlouhotrvající úlohy
  129. 129. Poslední tipy a triky
  130. 130. Poslední tipy a triky•BroadcastReceiver musí být rychlý
  131. 131. Poslední tipy a triky•BroadcastReceiver musí být rychlý•AsyncTask od 3.0 není paralelní by default
  132. 132. Poslední tipy a triky•BroadcastReceiver musí být rychlý•AsyncTask od 3.0 není paralelní by default•Neprovádět síťování v offline ale plánovat
  133. 133. Poslední tipy a triky•BroadcastReceiver musí být rychlý•AsyncTask od 3.0 není paralelní by default•Neprovádět síťování v offline ale plánovat •ConnectivityChangedReceiver
  134. 134. Poslední tipy a triky•BroadcastReceiver musí být rychlý•AsyncTask od 3.0 není paralelní by default•Neprovádět síťování v offline ale plánovat •ConnectivityChangedReceiver // If were not connected, enable the connectivity receiver // to call us back once we have a connection PackageManager pm = getPackageManager(); ComponentName connectivityReceiver = new ComponentName( this, ConnectivityChangedReceiver.class); pm.setComponentEnabledSetting( connectivityReceiver, PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP);
  135. 135. Rekapitulace•Chceme rychlé appky•Aktivity a fragmenty - hloupé/krátkodobé UI•Pamatovat na implicitní reference•V callbacku do UI kontrolovat jeho stav
  136. 136. Otázky
  137. 137. Otázky @ondraz
  138. 138. Otázky Feedback @ondraz mdc.conferoo.com

×