ݺߣ

ݺߣShare a Scribd company logo
Android a práce na
     pozadí
     Ondra Zahradník
   mDevCamp - 26.5.2012
Agenda
Agenda

•Motivace
Agenda

•Motivace
•Use-cases
Agenda

•Motivace
•Use-cases
•Diskuze
Motivace - bohaté API
Motivace - bohaté API

•Spousta nástrojů
Motivace - bohaté API

•Spousta nástrojů
 •Handler, AsyncTask, Service,
Motivace - bohaté API

•Spousta nástrojů
 •Handler, AsyncTask, Service,
 •AsyncQueryLoader, Loader,
Motivace - bohaté API

•Spousta nástrojů
 •Handler, AsyncTask, Service,
 •AsyncQueryLoader, Loader,
 •Worker Fragment,...
Motivace - bohaté API

•Spousta nástrojů
 •Handler, AsyncTask, Service,
 •AsyncQueryLoader, Loader,
 •Worker Fragment,...
•Málo dokumentace s best-practices
Motivace - bohaté API

•Spousta nástrojů
 •Handler, AsyncTask, Service,
 •AsyncQueryLoader, Loader,
 •Worker Fragment,...
•Málo dokumentace s best-practices
•Spousta nekvalitních apps
Motivace -rychlé appky
Motivace -rychlé appky

•Nechceme čekat, když čekáme
Motivace -rychlé appky

•Nechceme čekat, když čekáme
•Chceme rychlé appky
Motivace -rychlé appky

•Nechceme čekat, když čekáme
•Chceme rychlé appky
 1.síťovat, když se nikdo nedívá
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ě
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
Příklad - Corkbin pro iOS a Android
Příklad - Corkbin pro iOS a Android
Příklad - Corkbin pro iOS a Android
Příklad - Corkbin pro iOS a Android
Příklad - Corkbin pro iOS a Android
Příklad - Corkbin pro iOS a Android
Příklad - Corkbin pro iOS a Android
Příklad - Corkbin pro iOS a Android
Příklad - Corkbin pro iOS a Android
Příklad - Corkbin pro iOS a Android
Příklad - Corkbin pro iOS a Android
Omezený programovací model
Omezený programovací model

•Slabý procesor
Omezený programovací model

•Slabý procesor
•Opravdový multi-tasking
Omezený programovací model

•Slabý procesor
•Opravdový multi-tasking
•“Application not responding” aka. ANR
Omezený programovací model

•Slabý procesor
•Opravdový multi-tasking
•“Application not responding” aka. ANR
•Aktualizace UI pouze v ui threadu
Omezený programovací model

•Slabý procesor
•Opravdový multi-tasking
•“Application not responding” aka. ANR
•Aktualizace UI pouze v ui threadu
•UI žije jenom chvíli
Use-cases
Use-cases

• Znovuobjevení AsyncTasku
Use-cases

• Znovuobjevení AsyncTasku
• Stažení dat ze serveru
Use-cases

• Znovuobjevení AsyncTasku
• Stažení dat ze serveru
• Aktualizace modelu
Use-cases

• Znovuobjevení AsyncTasku
• Stažení dat ze serveru
• Aktualizace modelu
• Progress dialog
Use-cases

• Znovuobjevení AsyncTasku
• Stažení dat ze serveru
• Aktualizace modelu
• Progress dialog
• Dlouhotrvající úlohy
áٰ
áٰ

•AsyncTask – jednorázové operace
áٰ

•AsyncTask – jednorázové operace
•Loader – načítání dat pro view
áٰ

•AsyncTask – jednorázové operace
•Loader – načítání dat pro view
•AsyncQueryHandler – operace delete,
  update, create
áٰ

•AsyncTask – jednorázové operace
•Loader – načítání dat pro view
•AsyncQueryHandler – operace delete,
  update, create

•IntentService – jednorázově na pozadí bez
  UI
áٰ

•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
áٰ

•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
áٰ

•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í
Znovuobjevení AsyncTasku
Znovuobjevení AsyncTasku

•UI -> práce na pozadí -> aktualizace UI
Znovuobjevení AsyncTasku

•UI -> práce na pozadí -> aktualizace UI
•UI může skončit kdykoliv
Znovuobjevení AsyncTasku

•UI -> práce na pozadí -> aktualizace UI
•UI může skončit kdykoliv
•AsyncTask jako anonymní třída - drží
  Context
Znovuobjevení AsyncTasku

•UI -> práce na pozadí -> aktualizace UI
•UI může skončit kdykoliv
•AsyncTask jako anonymní třída - drží
  Context
Znovuobjevení AsyncTasku

•UI -> práce na pozadí -> aktualizace UI
•UI může skončit kdykoliv
•AsyncTask jako anonymní třída - drží
  Context
Znovuobjevení AsyncTasku

•UI -> práce na pozadí -> aktualizace UI
•UI může skončit kdykoliv
•AsyncTask jako anonymní třída - drží
  Context
Znovuobjevení AsyncTasku

•UI -> práce na pozadí -> aktualizace UI
•UI může skončit kdykoliv
•AsyncTask jako anonymní třída - drží
  Context
Znovuobjevení AsyncTasku
Znovuobjevení AsyncTasku
Znovuobjevení AsyncTasku




•Lepší je worker fragment -
  setRetainInstance()
Stažení dat ze serveru
Stažení dat ze serveru

•“Ukaž něco a pak aktualizuj”
Stažení dat ze serveru

•“Ukaž něco a pak aktualizuj”
•Cachovaná, aktualizovaná read-only data
Stažení dat ze serveru

•“Ukaž něco a pak aktualizuj”
•Cachovaná, aktualizovaná read-only data
•Cachovat HTTP response
Stažení dat ze serveru

•“Ukaž něco a pak aktualizuj”
•Cachovaná, aktualizovaná read-only data
•Cachovat HTTP response
•AsyncLoader
Stažení dat ze serveru

•“Ukaž něco a pak aktualizuj”
•Cachovaná, aktualizovaná read-only data
•Cachovat HTTP response
•AsyncLoader
•URLConnection
Stažení dat ze serveru

•“Ukaž něco a pak aktualizuj”
•Cachovaná, aktualizovaná read-only data
•Cachovat HTTP response
•AsyncLoader
•URLConnection
•HttpResponseCache - od v13
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
Stažení dat ze serveru
Stažení dat ze serveru

       Fragment

   zobrazí
    data


     AsyncLoader
Stažení dat ze serveru

       Fragment

   zobrazí
    data


     AsyncLoader

 poskytuje
   data


    Disková cache
Stažení dat ze serveru
                          vyvolá
                         refresh
       Fragment

   zobrazí
    data


     AsyncLoader              AsyncLoader

 poskytuje
   data


    Disková cache
Stažení dat ze serveru
                          vyvolá
                         refresh
       Fragment          zobrazí
                           data
   zobrazí
    data


     AsyncLoader              AsyncLoader

 poskytuje
   data


    Disková cache
Stažení dat ze serveru
                           vyvolá
                          refresh
       Fragment           zobrazí
                            data
   zobrazí
    data


     AsyncLoader                   AsyncLoader

 poskytuje
   data
                     aktualizuje
    Disková cache      cache
Stažení dat ze serveru 2
Stažení dat ze serveru 2

•Model v DB
Stažení dat ze serveru 2

•Model v DB
•Sync přes IntentService
Stažení dat ze serveru 2

•Model v DB
•Sync přes IntentService
•Přístup k modelu přes ContentProvider
Stažení dat ze serveru 2

•Model v DB
•Sync přes IntentService
•Přístup k modelu přes ContentProvider
 •REST-like api
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
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
Stažení dat ze serveru 2

        Fragment

  načítání dat


      CursorLoader
Stažení dat ze serveru 2

        Fragment

  načítání dat


      CursorLoader

  poskytuje
    data


    ContentProvider
Stažení dat ze serveru 2

        Fragment

  načítání dat


      CursorLoader

  poskytuje
    data

                      čte data
    ContentProvider              DB
Stažení dat ze serveru 2

                             vyvolá refresh
        Fragment

  načítání dat


      CursorLoader                     IntentService

  poskytuje
    data

                      čte data
    ContentProvider                           DB
Stažení dat ze serveru 2

                             vyvolá refresh
        Fragment

  načítání dat


      CursorLoader                     IntentService

  poskytuje                                        aktualizuje
    data                                              data

                      čte data
    ContentProvider                           DB
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
Aktualizace modelu
Aktualizace modelu

•Neblokovat UI, model v DB
Aktualizace modelu

•Neblokovat UI, model v DB
•V modelu stav synchronizace se serverem
Aktualizace modelu

•Neblokovat UI, model v DB
•V modelu stav synchronizace se serverem
 •flagy Status a Transaction/poslední změna
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
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
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
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
Aktualizace modelu
Aktualizace modelu



      Fragment

načítání dat
                   poskytuje
                     data
    CursorLoader               ContentProvider
Aktualizace modelu


                   update, create,
                      delete         AsyncQueryHandle
      Fragment                              r

načítání dat
                     poskytuje
                       data
    CursorLoader                     ContentProvider
Aktualizace modelu


                   update, create,
                      delete         AsyncQueryHandle
      Fragment                              r

                                                volá
načítání dat
                                              provider
                     poskytuje
                       data
    CursorLoader                     ContentProvider
Aktualizace modelu


                   update, create,
                      delete         AsyncQueryHandle
      Fragment                              r

                                                volá
načítání dat
                                              provider
                     poskytuje
                       data
    CursorLoader                     ContentProvider

                                                   mění data


                                                DB
Aktualizace modelu


                   update, create,
                      delete         AsyncQueryHandle
      Fragment                              r

                                                volá
načítání dat
                                              provider
                     poskytuje
                       data
    CursorLoader     notifikuje       ContentProvider
                       akci

                                                   mění data


                                                DB
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
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
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
Progress dialog
Progress dialog
Progress dialog

Blokuje UI dokud neskončí
důležitá operace
Progress dialog

Blokuje UI dokud neskončí
důležitá operace
Přežije změny konfigurace
Progress dialog

Blokuje UI dokud neskončí
důležitá operace
Přežije změny konfigurace
Lze ho stornovat
Progress dialog

Blokuje UI dokud neskončí
důležitá operace
Přežije změny konfigurace
Lze ho stornovat
Realizace přes
DialogFragment a
AsyncTask
Progress dialog
Progress dialog
Progress dialog
Progress dialog
Progress dialog
Progress dialog
Progress dialog
Dlouhotrvající úlohy
Dlouhotrvající úlohy
Dlouhotrvající úlohy

Service s worker threadem
Dlouhotrvající úlohy

Service s worker threadem
UI pro ovládání binduje
service
Dlouhotrvající úlohy

Service s worker threadem
UI pro ovládání binduje
service
UI je typicky několik
Dlouhotrvající úlohy

Service s worker threadem
UI pro ovládání binduje
service
UI je typicky několik
Notifikace přes callback a
model
Dlouhotrvající úlohy
Dlouhotrvající úlohy
Dlouhotrvající úlohy
Dlouhotrvající úlohy
Dlouhotrvající úlohy
Poslední tipy a triky
Poslední tipy a triky

•BroadcastReceiver musí být rychlý
Poslední tipy a triky

•BroadcastReceiver musí být rychlý
•AsyncTask od 3.0 není paralelní by default
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
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
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);
Rekapitulace

•Chceme rychlé appky
•Aktivity a fragmenty - hloupé/krátkodobé
  UI

•Pamatovat na implicitní reference
•V callbacku do UI kontrolovat jeho stav
mDevCamp - Android a práce na pozadí
á
á
 @ondraz
á     Feedback
 @ondraz




           mdc.conferoo.com

More Related Content

mDevCamp - Android a práce na pozadí

Editor's Notes

  • #2: 0.5min\n
  • #3: 0.5\n
  • #4: 0.5\n
  • #5: 0.5\n
  • #6: od geeku pro geeky\n\n1min\n
  • #7: od geeku pro geeky\n\n1min\n
  • #8: od geeku pro geeky\n\n1min\n
  • #9: od geeku pro geeky\n\n1min\n
  • #10: od geeku pro geeky\n\n1min\n
  • #11: od geeku pro geeky\n\n1min\n
  • #12: 2min\n
  • #13: 2min\n
  • #14: 2min\n
  • #15: 2min\n
  • #16: 2min\n
  • #17: 2min\n
  • #18: 2min\n
  • #19: 2min\n
  • #20: 2min\n
  • #21: 2min\n
  • #22: 2min\n
  • #23: 2min\n
  • #24: 2min\n
  • #25: 2min\n
  • #26: 2min\n
  • #27: 2min\n
  • #28: 2min\n
  • #29: 2min\n
  • #30: 2min\n
  • #31: 2min\n
  • #32: 2min\n
  • #33: 2min\n
  • #34: 2min\n
  • #35: 2min\n
  • #36: 2min\n
  • #37: 2min\n
  • #38: 2min\n
  • #39: 2min\n
  • #40: 2min\n
  • #41: 2min\n
  • #42: 2min\n
  • #43: 2min\n
  • #44: 2min\n
  • #45: 2min\n
  • #46: 2min\n
  • #47: 2min\n
  • #48: 2min\n
  • #49: 2min\n
  • #50: 2min\n
  • #51: 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
  • #52: 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
  • #53: 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
  • #54: 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
  • #55: 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
  • #56: 2min\n
  • #57: 2min\n
  • #58: 2min\n
  • #59: 2min\n
  • #60: 2min\n
  • #61: 3min\n\n19:30\n
  • #62: 3min\n\n19:30\n
  • #63: 3min\n\n19:30\n
  • #64: 3min\n\n19:30\n
  • #65: 3min\n\n19:30\n
  • #66: 3min\n\n19:30\n
  • #67: 3min\n\n19:30\n
  • #68: co se stane, kdyz se telefon otoci?\n\n3min\n\n
  • #69: co se stane, kdyz se telefon otoci?\n\n3min\n\n
  • #70: co se stane, kdyz se telefon otoci?\n\n3min\n\n
  • #71: co se stane, kdyz se telefon otoci?\n\n3min\n\n
  • #72: co se stane, kdyz se telefon otoci?\n\n3min\n\n
  • #73: co se stane, kdyz se telefon otoci?\n\n3min\n\n
  • #74: co se stane, kdyz se telefon otoci?\n\n3min\n\n
  • #75: i worker fragment musi pustit nejaky thread => async task\nnastavit cilovy fragment pres setTargetFragment()\n\n3min\n25:30\n
  • #76: i worker fragment musi pustit nejaky thread => async task\nnastavit cilovy fragment pres setTargetFragment()\n\n3min\n25:30\n
  • #77: i worker fragment musi pustit nejaky thread => async task\nnastavit cilovy fragment pres setTargetFragment()\n\n3min\n25:30\n
  • #78: i worker fragment musi pustit nejaky thread => async task\nnastavit cilovy fragment pres setTargetFragment()\n\n3min\n25:30\n
  • #79: i worker fragment musi pustit nejaky thread => async task\nnastavit cilovy fragment pres setTargetFragment()\n\n3min\n25:30\n
  • #80: i worker fragment musi pustit nejaky thread => async task\nnastavit cilovy fragment pres setTargetFragment()\n\n3min\n25:30\n
  • #81: i worker fragment musi pustit nejaky thread => async task\nnastavit cilovy fragment pres setTargetFragment()\n\n3min\n25:30\n
  • #82: i worker fragment musi pustit nejaky thread => async task\nnastavit cilovy fragment pres setTargetFragment()\n\n3min\n25:30\n
  • #83: nevyhody = neustale parsovani jsonu\n
  • #84: nevyhody = neustale parsovani jsonu\n
  • #85: nevyhody = neustale parsovani jsonu\n
  • #86: nevyhody = neustale parsovani jsonu\n
  • #87: nevyhody = neustale parsovani jsonu\n
  • #88: nevyhody = neustale parsovani jsonu\n
  • #89: nevyhody = neustale parsovani jsonu\n
  • #90: 2 min\n
  • #91: 2 min\n
  • #92: 2 min\n
  • #93: 2 min\n
  • #94: 2 min\n
  • #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
  • #101: 1.5 min\n\n=32.5\n
  • #102: 1.5 min\n\n=32.5\n
  • #103: 1.5 min\n\n=32.5\n
  • #104: 1.5 min\n\n=32.5\n
  • #105: 1.5 min\n\n=32.5\n
  • #106: WeakReference na volajici Context\nzavrit Cursor, pokud neni Context\n\n3 min\n
  • #107: WeakReference na volajici Context\nzavrit Cursor, pokud neni Context\n\n3 min\n
  • #108: WeakReference na volajici Context\nzavrit Cursor, pokud neni Context\n\n3 min\n
  • #109: WeakReference na volajici Context\nzavrit Cursor, pokud neni Context\n\n3 min\n
  • #110: WeakReference na volajici Context\nzavrit Cursor, pokud neni Context\n\n3 min\n
  • #111: WeakReference na volajici Context\nzavrit Cursor, pokud neni Context\n\n3 min\n
  • #112: WeakReference na volajici Context\nzavrit Cursor, pokud neni Context\n\n3 min\n
  • #113: do volani content provideru dat i volani service\n\n3 min\n38min\n
  • #114: do volani content provideru dat i volani service\n\n3 min\n38min\n
  • #115: do volani content provideru dat i volani service\n\n3 min\n38min\n
  • #116: do volani content provideru dat i volani service\n\n3 min\n38min\n
  • #117: do volani content provideru dat i volani service\n\n3 min\n38min\n
  • #118: do volani content provideru dat i volani service\n\n3 min\n38min\n
  • #119: do volani content provideru dat i volani service\n\n3 min\n38min\n
  • #120: do volani content provideru dat i volani service\n\n3 min\n38min\n
  • #121: 1 min\n
  • #122: 1 min\n
  • #123: 1 min\n
  • #124: 1 min\n
  • #125: 1 min\n
  • #126: co se stane, kdyz se telefon otoci?\n2min\n41 min\n
  • #127: co se stane, kdyz se telefon otoci?\n2min\n41 min\n
  • #128: co se stane, kdyz se telefon otoci?\n2min\n41 min\n
  • #129: co se stane, kdyz se telefon otoci?\n2min\n41 min\n
  • #130: co se stane, kdyz se telefon otoci?\n2min\n41 min\n
  • #131: co se stane, kdyz se telefon otoci?\n2min\n41 min\n
  • #132: service je jenom komponenta ktera drzi proces v pameti\nmuzu mit nekolik ui\n
  • #133: service je jenom komponenta ktera drzi proces v pameti\nmuzu mit nekolik ui\n
  • #134: service je jenom komponenta ktera drzi proces v pameti\nmuzu mit nekolik ui\n
  • #135: service je jenom komponenta ktera drzi proces v pameti\nmuzu mit nekolik ui\n
  • #136: service je jenom komponenta ktera drzi proces v pameti\nmuzu mit nekolik ui\n
  • #137: \n
  • #138: \n
  • #139: \n
  • #140: \n
  • #141: \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
  • #148: \n
  • #149: \n
  • #150: \n
  • #151: \n
  • #152: \n