Încărcător Android, manager de încărcătoare

Tag-uri: LoaderManager. Loader. LoaderManager.LoaderCallbacks. AsyncTaskLoader. CursorLoader

În versiunile mai vechi de Android, când au fost folosite metode de cursor, au fost considerate învechite.







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

Prima metodă a funcționat în ciclul de viață al activității. Cursorul a fost dezactivat sau închis automat când activitatea a fost oprită sau închisă. Când se repornește activitatea, cursorul este de asemenea activat, creând o solicitare repetată la date.

A doua metodă a efectuat cererea în sine. Problema cu metoda constă în faptul că au lucrat în același flux cu interfața aplicației și de a efectua solicitări suplimentare la schimbarea stării de activitate, încetinind întreaga aplicație, în cazul în care baza de date a fost prea mare.

De exemplu, vom încărca datele în listă în mod vechi, utilizând furnizorul de conținut. Rezultatul este procesat de SimpleCursorAdapter și afișat.

Acest cod trebuie eliminat din motivele descrise mai sus, astfel încât să nu aibă probleme de performanță.

Începând cu versiunea Android 3.0, a existat un alt mecanism de lucru cu încărcătorul încărcătorului și managerul LoaderManager. care sunt de asemenea disponibile în biblioteca de compatibilitate pentru dispozitive mai vechi.

Acum, toate operațiile cu cursoare apar în modul asincron. Datele sunt stocate în cache și, dacă este necesar, informațiile sunt actualizate dacă datele s-au schimbat.

LoaderManager

LoaderManager vă permite să gestionați corect încărcătoarele asociate activității sau fragmentului. Fiecare activitate și fiecare fragment are o instanță a LoaderManager. care funcționează cu încărcătoare prin metodele initLoader (). restartLoader (). destroyLoader (). Activitatea prin acest manager poate avertiza despre distrugerea acestuia, astfel încât LoaderManager la rândul său să închidă încărcătoarele pentru a economisi resurse.

LoaderManager însăși nu știe cum se încarcă datele în aplicație. Instrucționează pur și simplu încărcătorul să înceapă, să oprească, să actualizeze încărcarea datelor și alte comenzi.

LoaderManager funcționează cu obiecte Loader. unde D este containerul pentru datele încărcate. Datele nu trebuie să fie un cursor. Se poate lista. JSONArray, etc. Într-o activitate pot exista mai mulți încărcătoare, care sunt obiecte.

Clasa Loader este generică. De asemenea, sunt disponibile încărcătoare specializate AsyncTaskLoader și CursorLoader.

Lucrul cu LoaderManager are loc prin trei metode de apel invers al interfeței LoaderManager.LoaderCallbacks .

Interfața LoaderManager.LoaderCallbacks

Interfața LoaderManager.LoaderCallbacks determină ordinea interacțiunii cu încărcătorul prin metode:

onCreateLoader ()

Metoda onCreateLoader () returnează un încărcător nou. LoaderManager apelează metoda la crearea încărcătorului.

Când accesați încărcătorul (de exemplu, utilizând metoda initLoader (), acesta verifică dacă încărcătorul specificat de identificator există. Dacă aceasta nu există, ea apelează metoda onCreateLoader (). Aici este creat un nou bootloader.

onLoadFinished ()

Metoda onLoadFinished este apelată automat când Loader termină încărcarea datelor. Încărcătorul monitorizează datele primite, iar managerul primește notificarea finalizării descărcării și trimite rezultatul la această metodă.

Această metodă este garantată pentru a fi apelată înainte de lansarea ultimelor date furnizate acestui încărcător. În acest moment, este necesar să nu mai folosiți datele vechi (de îndată ce vor fi înlocuite). Cu toate acestea, nu ar trebui să faceți acest lucru singur, deoarece datele sunt deținute de încărcător și el va avea grijă de acest lucru. Încărcătorul va elibera datele de îndată ce va afla că aplicația nu o mai folosește. De exemplu, dacă datele sunt un cursor de la CursorLoader. nu apelați singur (). Dacă cursorul este plasat în CursorAdapter. Utilizați metoda swapCursor () astfel încât vechiul Cursor să nu se închidă.

onLoadReset ()

Metoda onLoadReset () reîncarcă datele din încărcător.







Această metodă se numește atunci când starea încărcătorului creat anterior este resetată, ceea ce duce la pierderea datelor sale. Acest apel de apel vă permite să știți când vor fi lansate date, astfel încât să puteți șterge linkul către ele.

Ordinea administratorului încărcătorului în timpul creării activității.

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

La schimbarea configurației (rotire, etc.):

Aplicație: config modificat
Activity.onCreate
Activity.onStart
[Fără apel la serviciul onCreateLoader]
LoaderManager.LoaderCallbacks.onLoadFinished
[opțiuni pe măsură ce textul de căutare are text în el]
SearchView.onQueryChangeText (Căutați după text, consultați exemplele de mai jos)
RestartLoader
LoaderManager.LoaderCallbacks.onCreateLoader
LoaderManager.LoaderCallbacks.onLoadFinished

Când activitatea este distrusă:

Activitate.onStop ()
Activity.onDestroy ()
LoaderManager.LoaderCallbacks.onLoaderReset () // Rețineți că această metodă este apelată

Încărcător ()

Managerul încărcătorului gestionează încărcătoarele. Încărcătorul este proiectat să încarce date dintr-o sursă: disc, bază de date, furnizor de conținut, rețea sau alt proces. Încărcătorul preia date fără a bloca firul principal într-un fir separat și oferă rezultate către partea interesată de acestea, monitorizând modificările datelor și informând managerul despre toate schimbările importante prin intermediul ascultătorilor speciali.

Astfel, activitatea sau fragmentul nu este interesat de modul în care sunt încărcate datele. Ei au încredințat această sarcină încărcătorului.

Există trei tipuri de încărcătoare încorporate: încărcător. AsyncTaskLoader și CursorLoader. Loader - clasa de bază, care în sine nu este foarte utilă. Acesta definește API-ul pe care îl folosește LoaderManager pentru a interacționa cu toți încărcătorii.

AsyncTaskLoader

Pentru sarcini de încărcare a datelor asincrone într-un thread separat, o clasă care moștenește AsyncTaskLoader în loc de Loader. Class AsyncTaskLoader este abstractă și funcționează ca AsyncTask. Bazându-vă pe această clasă, puteți implementa metoda abstractInBackground ().

Ascultătorul primește informații de la încărcător. Pentru a face acest lucru, managerul înregistrează ascultătorul OnLoadCompleteListener. care ascultă evenimentele. După terminarea descărcării, este apelată metoda onLoadFinished (Loader) încărcător, rezultat D).

Pentru ca încărcătorul să funcționeze, acesta trebuie pornit. Încărcătorul inițiat monitorizează datele până când se repornește sau se oprește.

Încărcătorul oprit continuă să monitorizeze modificările datelor, dar nu le raportează. Dacă este necesar, puteți reporni sau reporni încărcătorul de încărcare oprit.

La repornire, încărcătorul nu ar trebui să înceapă descărcarea de date și să monitorizeze modificările. Sarcina sa este de a elibera date inutile. Această stare este rar utilizată, dar în unele cazuri este necesară.

Sarcina dvs. este să creați propriul bootloader, să implementați metoda loadInBackground () și să înlocuiți metodele onStartLoading (). onStopLoading (). onReset (). onCanceled (). deliverResult (rezultate D).

Un mic exemplu de demonstrație. Un exemplu de aici.

Creați un buton și o etichetă de text pe ecran.

Să creăm o clasă de încărcătoare care moștenește de la AsyncTaskLoader. Încărcătorul nostru va returna un șir, deci să spunem :

Variabila mWord va stoca șirul de bază, pe baza căruia va fi creat un șir aleator. Acest parametru este trecut când încărcătorul este creat în constructor folosind obiectul Bundle. Constanta RANDOM_STRING_LENGTH specifică lungimea maximă a noului șir aleatoriu.

Moștenit de la AsyncTaskLoader. noi redefinim mai multe metode:

  • loadInBackground () este metoda în care toate lucrările de încărcare de date ar trebui să fie create
  • onStartLoading () - declanșat când încărcătorul de boot pornește (dar acest lucru nu înseamnă că datele sunt încărcate)
  • onStopLoading () - declanșat când încărcătorul de încărcare se oprește
  • deliverResult () - primește și returnează rezultatul final al încărcătorului
  • forceLoad () - încărcarea "forțată" a datelor noi

Pentru a obține datele în metoda loadInBackground (), sunăm metoda auxiliară generateString (). care generează un șir aleator.

Clasa de activitate implementează LoaderManager.LoaderCallbacks interfață cu metodele sale, permițându-ne să „participe“, în ciclul de viață al încărcătorului și să interacționeze cu LoaderManager.

Metoda onCreateLoader () este apelată atunci când bootloader-ul este inițializat. Dacă încărcătorul cu un astfel de identificator a fost deja creat, metoda nu va fi apelată. În interior, determinăm ce identificator am fost dat pentru a crea încărcătorul necesar. Dacă încărcătorul este numai unul, atunci condiția poate fi eliminată.

Metoda onLoadFinished () este apelată când descărcarea este finalizată. Metoda primește datele descărcate, precum și obiectul încărcătorului. Extinem șirul rezultat într-o etichetă de text.

Metoda onLoaderReset () este apelată atunci când încărcătorul de boot este resetat. Aici, datele sunt resetate la zero și trebuie să ștergem toate referințele la acestea.

Un clic pe buton acționează ca un declanșator pentru a începe o nouă descărcare de date. Folosim metoda onContentChanged (). Pentru a semnala încărcătorului modificarea datelor.

Cum se produce primul încărcător de încărcare? Noi o facem în metoda onCreate (). inițializarea încărcătorului. În timpul inițializării, vom trece identificatorul parametri încărcător, Bundle - obiectul care conține argumentele trecut (trecem linia de bază) și un pointer la un apel invers-site-uri (în cazul nostru - este ea însăși activitate).

Acum rulați aplicația și priviți jurnalele. Când faceți clic pe buton, textul este actualizat, dar în jurnalele nu mai vedem re-crearea bootloader-ului.

CursorLoader

Clasa CursorLoader este succesorul clasei Loader și lucrează cu cursoare în modul asincron. CursorLoader extinde AsyncTaskLoader pentru a încărca cursorul din ContentProvider prin ContentResolver.

Lectură suplimentară







Articole similare

Trimiteți-le prietenilor: