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.
1 of 139
Downloaded 29 times
More Related Content
mDevCamp - Android a práce na pozadí
1. Android a práce na
pozadí
Ondra Zahradník
mDevCamp - 26.5.2012
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. 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
34. Omezený programovací model
•Slabý procesor
•Opravdový multi-tasking
•“Application not responding” aka. ANR
•Aktualizace UI pouze v ui threadu
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
45. áٰ
•AsyncTask – jednorázové operace
•Loader – načítání dat pro view
•AsyncQueryHandler – operace delete,
update, create
46. áٰ
•AsyncTask – jednorázové operace
•Loader – načítání dat pro view
•AsyncQueryHandler – operace delete,
update, create
•IntentService – jednorázově na pozadí bez
UI
47. áٰ
•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. áٰ
•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. áٰ
•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í
63. Stažení dat ze serveru
•“Ukaž něco a pak aktualizuj”
•Cachovaná, aktualizovaná read-only data
64. Stažení dat ze serveru
•“Ukaž něco a pak aktualizuj”
•Cachovaná, aktualizovaná read-only data
•Cachovat HTTP response
65. Stažení dat ze serveru
•“Ukaž něco a pak aktualizuj”
•Cachovaná, aktualizovaná read-only data
•Cachovat HTTP response
•AsyncLoader
66. Stažení dat ze serveru
•“Ukaž něco a pak aktualizuj”
•Cachovaná, aktualizovaná read-only data
•Cachovat HTTP response
•AsyncLoader
•URLConnection
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. 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
77. Stažení dat ze serveru 2
•Model v DB
•Sync přes IntentService
78. Stažení dat ze serveru 2
•Model v DB
•Sync přes IntentService
•Přístup k modelu přes ContentProvider
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. 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. 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. Stažení dat ze serveru 2
Fragment
načítání dat
CursorLoader
83. Stažení dat ze serveru 2
Fragment
načítání dat
CursorLoader
poskytuje
data
ContentProvider
84. Stažení dat ze serveru 2
Fragment
načítání dat
CursorLoader
poskytuje
data
čte data
ContentProvider DB
85. Stažení dat ze serveru 2
vyvolá refresh
Fragment
načítání dat
CursorLoader IntentService
poskytuje
data
čte data
ContentProvider DB
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. 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
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. 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. 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. 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
97. Aktualizace modelu
Fragment
načítání dat
poskytuje
data
CursorLoader ContentProvider
98. Aktualizace modelu
update, create,
delete AsyncQueryHandle
Fragment r
načítání dat
poskytuje
data
CursorLoader ContentProvider
99. Aktualizace modelu
update, create,
delete AsyncQueryHandle
Fragment r
volá
načítání dat
provider
poskytuje
data
CursorLoader ContentProvider
100. Aktualizace modelu
update, create,
delete AsyncQueryHandle
Fragment r
volá
načítání dat
provider
poskytuje
data
CursorLoader ContentProvider
mění data
DB
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. 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. 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. 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
131. Poslední tipy a triky
•BroadcastReceiver musí být rychlý
•AsyncTask od 3.0 není paralelní by default
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. 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. 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 we're 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);
#95: proc doporucuju contentProvider\n srozumitelne api\n snadne notifikace\n prace s db na jednom miste\n podpora pro background - CursorLoader, AsyncQueryHandler\nCursorLoader se umi sam refreshnout\n\n2min\n
#96: proc doporucuju contentProvider\n srozumitelne api\n snadne notifikace\n prace s db na jednom miste\n podpora pro background - CursorLoader, AsyncQueryHandler\nCursorLoader se umi sam refreshnout\n\n2min\n
#97: proc doporucuju contentProvider\n srozumitelne api\n snadne notifikace\n prace s db na jednom miste\n podpora pro background - CursorLoader, AsyncQueryHandler\nCursorLoader se umi sam refreshnout\n\n2min\n
#98: proc doporucuju contentProvider\n srozumitelne api\n snadne notifikace\n prace s db na jednom miste\n podpora pro background - CursorLoader, AsyncQueryHandler\nCursorLoader se umi sam refreshnout\n\n2min\n
#99: proc doporucuju contentProvider\n srozumitelne api\n snadne notifikace\n prace s db na jednom miste\n podpora pro background - CursorLoader, AsyncQueryHandler\nCursorLoader se umi sam refreshnout\n\n2min\n
#100: proc doporucuju contentProvider\n srozumitelne api\n snadne notifikace\n prace s db na jednom miste\n podpora pro background - CursorLoader, AsyncQueryHandler\nCursorLoader se umi sam refreshnout\n\n2min\n
#142: do 10s, nespoustet nic dlouheho - take bezi v main threadu - radsi spustit IntentService\n\nna zaver kousek kodu, abyste neodesli nepoznamenani\n
#143: do 10s, nespoustet nic dlouheho - take bezi v main threadu - radsi spustit IntentService\n\nna zaver kousek kodu, abyste neodesli nepoznamenani\n
#144: do 10s, nespoustet nic dlouheho - take bezi v main threadu - radsi spustit IntentService\n\nna zaver kousek kodu, abyste neodesli nepoznamenani\n
#145: do 10s, nespoustet nic dlouheho - take bezi v main threadu - radsi spustit IntentService\n\nna zaver kousek kodu, abyste neodesli nepoznamenani\n
#146: do 10s, nespoustet nic dlouheho - take bezi v main threadu - radsi spustit IntentService\n\nna zaver kousek kodu, abyste neodesli nepoznamenani\n
#147: a v callbacku testovat stav ui - finished, pripojeny fragment\n