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.
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
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. 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. 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. 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í
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);
je zaklad naucit se premyslet o UI jako veci, ktera je jenom chvilkova\nrozdelit si aplikaci na ui, boilerplate a model\n\n2min\n\n=13:30\n
je zaklad naucit se premyslet o UI jako veci, ktera je jenom chvilkova\nrozdelit si aplikaci na ui, boilerplate a model\n\n2min\n\n=13:30\n
je zaklad naucit se premyslet o UI jako veci, ktera je jenom chvilkova\nrozdelit si aplikaci na ui, boilerplate a model\n\n2min\n\n=13:30\n
je zaklad naucit se premyslet o UI jako veci, ktera je jenom chvilkova\nrozdelit si aplikaci na ui, boilerplate a model\n\n2min\n\n=13:30\n
je zaklad naucit se premyslet o UI jako veci, ktera je jenom chvilkova\nrozdelit si aplikaci na ui, boilerplate a model\n\n2min\n\n=13:30\n
2min\n
2min\n
2min\n
2min\n
2min\n
3min\n\n19:30\n
3min\n\n19:30\n
3min\n\n19:30\n
3min\n\n19:30\n
3min\n\n19:30\n
3min\n\n19:30\n
3min\n\n19:30\n
co se stane, kdyz se telefon otoci?\n\n3min\n\n
co se stane, kdyz se telefon otoci?\n\n3min\n\n
co se stane, kdyz se telefon otoci?\n\n3min\n\n
co se stane, kdyz se telefon otoci?\n\n3min\n\n
co se stane, kdyz se telefon otoci?\n\n3min\n\n
co se stane, kdyz se telefon otoci?\n\n3min\n\n
co se stane, kdyz se telefon otoci?\n\n3min\n\n
i worker fragment musi pustit nejaky thread => async task\nnastavit cilovy fragment pres setTargetFragment()\n\n3min\n25:30\n
i worker fragment musi pustit nejaky thread => async task\nnastavit cilovy fragment pres setTargetFragment()\n\n3min\n25:30\n
i worker fragment musi pustit nejaky thread => async task\nnastavit cilovy fragment pres setTargetFragment()\n\n3min\n25:30\n
i worker fragment musi pustit nejaky thread => async task\nnastavit cilovy fragment pres setTargetFragment()\n\n3min\n25:30\n
i worker fragment musi pustit nejaky thread => async task\nnastavit cilovy fragment pres setTargetFragment()\n\n3min\n25:30\n
i worker fragment musi pustit nejaky thread => async task\nnastavit cilovy fragment pres setTargetFragment()\n\n3min\n25:30\n
i worker fragment musi pustit nejaky thread => async task\nnastavit cilovy fragment pres setTargetFragment()\n\n3min\n25:30\n
i worker fragment musi pustit nejaky thread => async task\nnastavit cilovy fragment pres setTargetFragment()\n\n3min\n25:30\n
nevyhody = neustale parsovani jsonu\n
nevyhody = neustale parsovani jsonu\n
nevyhody = neustale parsovani jsonu\n
nevyhody = neustale parsovani jsonu\n
nevyhody = neustale parsovani jsonu\n
nevyhody = neustale parsovani jsonu\n
nevyhody = neustale parsovani jsonu\n
2 min\n
2 min\n
2 min\n
2 min\n
2 min\n
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
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
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
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
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
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
1.5 min\n\n=32.5\n
1.5 min\n\n=32.5\n
1.5 min\n\n=32.5\n
1.5 min\n\n=32.5\n
1.5 min\n\n=32.5\n
WeakReference na volajici Context\nzavrit Cursor, pokud neni Context\n\n3 min\n
WeakReference na volajici Context\nzavrit Cursor, pokud neni Context\n\n3 min\n
WeakReference na volajici Context\nzavrit Cursor, pokud neni Context\n\n3 min\n
WeakReference na volajici Context\nzavrit Cursor, pokud neni Context\n\n3 min\n
WeakReference na volajici Context\nzavrit Cursor, pokud neni Context\n\n3 min\n
WeakReference na volajici Context\nzavrit Cursor, pokud neni Context\n\n3 min\n
WeakReference na volajici Context\nzavrit Cursor, pokud neni Context\n\n3 min\n
do volani content provideru dat i volani service\n\n3 min\n38min\n
do volani content provideru dat i volani service\n\n3 min\n38min\n
do volani content provideru dat i volani service\n\n3 min\n38min\n
do volani content provideru dat i volani service\n\n3 min\n38min\n
do volani content provideru dat i volani service\n\n3 min\n38min\n
do volani content provideru dat i volani service\n\n3 min\n38min\n
do volani content provideru dat i volani service\n\n3 min\n38min\n
do volani content provideru dat i volani service\n\n3 min\n38min\n
1 min\n
1 min\n
1 min\n
1 min\n
1 min\n
co se stane, kdyz se telefon otoci?\n2min\n41 min\n
co se stane, kdyz se telefon otoci?\n2min\n41 min\n
co se stane, kdyz se telefon otoci?\n2min\n41 min\n
co se stane, kdyz se telefon otoci?\n2min\n41 min\n
co se stane, kdyz se telefon otoci?\n2min\n41 min\n
co se stane, kdyz se telefon otoci?\n2min\n41 min\n
service je jenom komponenta ktera drzi proces v pameti\nmuzu mit nekolik ui\n
service je jenom komponenta ktera drzi proces v pameti\nmuzu mit nekolik ui\n
service je jenom komponenta ktera drzi proces v pameti\nmuzu mit nekolik ui\n
service je jenom komponenta ktera drzi proces v pameti\nmuzu mit nekolik ui\n
service je jenom komponenta ktera drzi proces v pameti\nmuzu mit nekolik ui\n
\n
\n
\n
\n
\n
do 10s, nespoustet nic dlouheho - take bezi v main threadu - radsi spustit IntentService\n\nna zaver kousek kodu, abyste neodesli nepoznamenani\n
do 10s, nespoustet nic dlouheho - take bezi v main threadu - radsi spustit IntentService\n\nna zaver kousek kodu, abyste neodesli nepoznamenani\n
do 10s, nespoustet nic dlouheho - take bezi v main threadu - radsi spustit IntentService\n\nna zaver kousek kodu, abyste neodesli nepoznamenani\n
do 10s, nespoustet nic dlouheho - take bezi v main threadu - radsi spustit IntentService\n\nna zaver kousek kodu, abyste neodesli nepoznamenani\n
do 10s, nespoustet nic dlouheho - take bezi v main threadu - radsi spustit IntentService\n\nna zaver kousek kodu, abyste neodesli nepoznamenani\n
a v callbacku testovat stav ui - finished, pripojeny fragment\n