Android betöltő, loadermanager

Címkék: LoaderManager. Rakodó. LoaderManager.LoaderCallbacks. AsyncTaskLoader. CursorLoader

Az Android régebbi verzióiban használták a kurzoros módszerek használatát, amelyek most már elavultnak tekintendők.

  • startManagingCursor (kurzor)
  • managedQuery (Uri, String, String, String, String)

Az első módszer a tevékenység életciklusában működött. A kurzor automatikusan kikapcsolt vagy lezárt állapotban volt, amikor a tevékenység leállt vagy lezárt volt. A tevékenység újraindítása után a kurzor aktiválódik, és ismételt kérést indít az adatokhoz.

A második módszer maga hajtotta végre a kérést. A módszerrel kapcsolatos probléma az volt, hogy ugyanazt a szálat dolgozták fel az alkalmazás felületén, és szükségtelen lekérdezéseket hajtottak végre, amikor a tevékenység állapota megváltozott, fékezve az egész alkalmazást, ha az adatbázis túl nagy volt.

Például az adatokat a régiben, a tartalomszolgáltatók segítségével töltjük be a listába. Az eredmény feldolgozása a SimpleCursorAdapter segítségével történik, és megjelenik.

Ezt a kódot a fenti okok miatt el kell dobni, hogy ne legyenek teljesítményproblémák.

Az Android 3.0-mal kezdődően volt egy másik mechanizmus a Loader és a LoaderManager kezelőhöz. amelyek a régebbi eszközök kompatibilitási könyvtárában is megtalálhatók.

Most minden kurzoros művelet aszinkron üzemmódban történik. Az adatokat gyorsítótárba helyezi, és szükség esetén frissíti az adatokat, ha az adatok megváltoztak.

LoaderManager

A LoaderManager lehetővé teszi a tevékenységhez vagy töredékhez tartozó rakodók megfelelő kezelését. Minden tevékenységnek és minden egyes töredéknek van egy példánya a LoaderManagernek. amely az initLoader () módszerekkel a rakodókkal működik. restartLoader (). destroyLoader (). A menedzseren keresztül végzett tevékenység figyelmeztethet a megsemmisítésére, így a LoaderManager a források megtakarításával bezárja a rakodókat.

Maga a LoaderManager nem tudja, hogyan töltik be az adatokat az alkalmazásba. Egyszerűen utasítja a betöltőt az adatterhelés és egyéb parancsok indítására, leállítására, frissítésére.

A LoaderManager Loader objektumokkal dolgozik. ahol D a feltöltött adatok tárolója. Az adatoknak nem kell kurzornak lennie. Lehet List. JSONArray stb. Egy tevékenységben több rakodó is lehet, amelyek tárgyak.

A Loader osztály általános. Az AsyncTaskLoader és a CursorLoader speciális meghajtású gépek is rendelkezésre állnak.

A LoaderManagerrel való munka a LoaderManager.LoaderCallbacks felület három visszahívási módján keresztül történik .

Interfész LoaderManager.LoaderCallbacks

Interfész LoaderManager.LoaderCallbacks meghatározza a kölcsönhatás sorrendjét a betöltővel módszerekkel:

onCreateLoader ()

Az onCreateLoader () módszer egy új betöltőt ad vissza. A LoaderManager felhívja a módszert, amikor a Loader létrejön.

A betöltőhöz való hozzáféréskor (például az initLoader () módszerrel) ellenőrzi, hogy létezik-e az azonosító által megadott betöltő. Ha nem létezik, az onCreateLoader () metódust hívja. Itt van, hogy létrehoz egy új rendszerbetöltőt.

onLoadFinished ()

Az onLoadFinished metódus automatikusan hívásra kerül, amikor a Loader befejezi az adatok betöltését. A betöltő figyeli a beérkező adatokat, és a kezelő értesítést kap a letöltés befejezéséről, és elküldi az eredményt erre a módszerre.

Ezt a módszert garantáltan hívják, mielőtt a jelen betöltőhöz megadott utolsó adatok felszabadulnának. Ez idő alatt meg kell szüntetni a régi adatok (hamarosan cserélni) használatát. Ezt azonban nem szabad megtennie, mert az adatok a betöltő tulajdonában vannak, és ő gondoskodik róla. A betöltő felszabadítja az adatokat, amint kiderül, hogy az alkalmazás már nem használja. Például, ha az adatok egy kurzor a CursorLoader. ne hívja közel () magát. Ha a kurzor a kurzoradapterbe kerül. Használja a swapCursor () metódust úgy, hogy a régi kurzor ne záródjon le.

onLoadReset ()

Az onLoadReset () módszer újratölti az adatokat a betöltőben.

Ezt a módszert akkor hívják, ha az előzőleg létrehozott betöltő állapota újraindul, ami elveszti adatait. Ez a visszahívás lehetővé teszi, hogy tudni lehessen, mikor kell kiadni az adatokat, hogy törölje a linket rájuk.

A rakodókezelő sorrendje a tevékenység létrehozása során.

Application.onCreate ()
Activity.onCreate ()
LoaderManager.LoaderCallbacks.onCreateLoader ()
Activity.onStart ()
Activity.onResume ()
LoaderManager.LoaderCallbacks.onLoadFinished ()

A konfiguráció megváltoztatásakor (forgatás stb.):

Alkalmazás: a konfiguráció megváltozott
Activity.onCreate
Activity.onStart
[Nincs hívás az onCreateLoader-re]
LoaderManager.LoaderCallbacks.onLoadFinished
[opciók keresési nézetben tartalmaz szöveget]
SearchView.onQueryChangeText (Szöveg szerinti keresés, lásd az alábbi példákat)
RestartLoader
LoaderManager.LoaderCallbacks.onCreateLoader
LoaderManager.LoaderCallbacks.onLoadFinished

Amikor a tevékenység megsemmisül:

Activity.onStop ()
Activity.onDestroy ()
LoaderManager.LoaderCallbacks.onLoaderReset () // Megjegyezzük, hogy ez a módszer neve

Loader (Loader)

A rakodókezelő kezeli a rakodókat. A betöltőt úgy tervezték, hogy adatokat töltsön be egy forrásból: lemez, adatbázis, tartalomszolgáltató, hálózat vagy más folyamat. A betöltő a fonalat külön menetben blokkolja, és az eredményeket az érdeklődő oldalra visszük, az adatok változásait figyelemmel kísérik, és a vezetővel tájékoztatják az összes fontos változást a speciális hallgatókon keresztül.

Tehát az aktivitás vagy töredék nem érdekli az adatok betöltésének módját. Ezt a munkát a betöltőnek bízta.

Három beépített betöltő típus létezik: Loader. Az AsyncTaskLoader és a CursorLoader. Loader - alap osztály, ami önmagában nem nagyon hasznos. Meghatározza az API-t, amelyet a LoaderManager az összes rakodóhoz való kapcsolódásra használ.

AsyncTaskLoader

Az aszinkron adattovábbítás feladatait külön szálon, egy olyan osztályt, amely az AsyncTaskLoader-t örököli a Loader helyett. Az AsyncTaskLoader osztály absztrakt és AsyncTaskként működik. Ezen osztály alapján megvalósíthatja a loadInBackground () absztrakt módszert.

A hallgatók információkat kapnak a betöltőről. Ehhez a kezelő regisztrálja az OnLoadCompleteListener listát. amely figyeli az eseményeket. A letöltés befejezésekor az onLoadFinished (Loader) módszer nevezik betöltő, D eredmény).

Ahhoz, hogy a rendszerindító betöltő működjön, el kell indítani. Az indított betöltő figyeli az adatokat mindaddig, amíg újraindul vagy leáll.

A leállított betöltő továbbra is figyelemmel kíséri az adatokban bekövetkezett változásokat, de nem jelenti azokat. Szükség esetén újraindíthatja vagy újraindíthatja az indított betöltõprogramot.

Újraindításkor a betöltőnek nem szabad új adatletöltést indítani, és nem figyelnie a változtatásokat. Feladata a felesleges adatok felszabadítása. Ezt az állapotot ritkán használják, de bizonyos esetekben erre szükség van.

Az Ön feladata, hogy létrehozza a saját boot-betöltőjét, végrehajtsa a loadInBackground () metódust, és felülírja az onStartLoading () metódusokat. onStopLoading (). onReset (). onCanceled (). deliverResult (D eredmények).

Kis példa a demonstrációra. Egy példa innen.

Hozzon létre egy gombot és egy szöveges címkét a képernyőn.

Hozzunk létre egy betöltő osztályt, amely örökli az AsyncTaskLoader-t. A betöltőnk visszaadja a karakterláncot, szóval mondjuk :

Az mWord változó tárolja az alapzsinórt, amely alapján véletlenszerű karakterláncot hoznak létre. Ez a paraméter akkor kerül átadásra, ha a betöltő a konstruktorban van létrehozva a Bundle objektum használatával. Az állandó RANDOM_STRING_LENGTH megadja az új véletlenszerű karakterlánc maximális hosszát.

Az AsyncTaskLoader örökölte. számos módszert újradefiniálunk:

  • A loadInBackground () az a módszer, amelyben maga az összes adattöltési munka létrejön
  • onStartLoading () - a boot betöltő indításakor aktiválódik (de ez nem jelenti azt, hogy az adatok betöltődnek)
  • onStopLoading () - a rendszertöltő letiltása után aktiválódik
  • deliverResult () - megkapja és visszaadja a betöltő végeredményét
  • forceLoad () - "kényszerített" új adatok betöltése

Az adatok beolvasása a loadInBackground () metódusba, a kiegészítő generateString () metódusnak hívjuk. amely véletlenszerű karakterláncot generál.

A tevékenységi osztály végrehajtja a LoaderManager.LoaderCallbacks interfészt a módszerekkel, amelyek lehetővé teszik számunkra, hogy "részt vegyenek" a betöltő életciklusában és kölcsönhatásba lépjenek a LoaderManagerrel.

Az onCreateLoader () metódus a bootloader indításakor kerül meghívásra. Ha az ilyen azonosítóval rendelkező betöltő már létrehozásra került, a módszert nem hívják meg. Belülünk, meghatározzuk, melyik azonosítót adtuk meg a szükséges betöltő létrehozásához. Ha a betöltő csak egy, akkor az állapot eltávolítható.

Az onLoadFinished () metódus a letöltés befejezésekor szól. A módszer a letöltött adatokat, valamint a betöltő objektumot kapja. A kapott karakterláncot szöveges címkén adjuk ki.

Az onLoaderReset () módszer a boot betöltő nullázásakor hívásra kerül. Itt az adatok nullázásra kerülnek, és minden hivatkozást törölni kell rájuk.

A gombkattintás az új adatletöltés indításakor a trigger. Az onContentChanged () metódust használjuk. A betöltő jelzése az adatok megváltoztatásával kapcsolatban.

Hogyan történik az első indító betöltő? Ezt az onCreate () módszerrel tesszük. a betöltő inicializálása. Az inicializálás során átadjuk a bootloader azonosítót a paraméterek között, a Bundle az átvitt argumentumokat tartalmazó objektum (átadjuk az alaphangot) és egy mutatót a visszahívó objektumnak (esetünkben ez a tevékenység maga).

Nos, futtassa az alkalmazást, és nézze meg a naplókat. Ha rákattint a gombra, a szöveg frissül, de a naplókban már nem látjuk a bootloader újra létrehozását.

CursorLoader

A CursorLoader osztály a Loader osztály utódja, és kurzorokkal dolgozik aszinkron üzemmódban. A CursorLoader kiterjeszti az AsyncTaskLoader alkalmazást, hogy betöltse a Kurzort a ContentProvider-ről a ContentResolver segítségével.

További olvasmány

Kapcsolódó cikkek