Curente vă permit să efectuați mai multe sarcini simultan, fără a interfera unele cu altele, ceea ce face posibilă utilizarea eficientă a resurselor de sistem. Fluxurile sunt folosite în cazuri, când o acțiune de joc lung nu ar trebui să interfereze cu alte activități. De exemplu, avem un music player cu butoane de redare și pauză. Dacă apăsați butonul de redare și executați un fișier de muzică într-un fir separat, nu puteți apăsa butonul de pauză până când fișierul va reproduce în întregime. Cu Streams, puteți lucra în jurul valorii de această limitare.
Utilizarea fire de fundal
Pentru a fi sigur că aplicația dumneavoastră nu pierde capacitatea de reacție, o soluție bună ar fi să se mute toate operațiunile lente, intensivă a forței de muncă din fluxul principal de aplicare a copilului.
Toate componentele aplicației în Android, inclusiv activitățile, serviciile și intențiile receptoarelor de radiodifuziune, încep să lucreze în firul principal al aplicației. Ca urmare, operațiunile de utilizare intensivă a forței de muncă în oricare dintre aceste componente blochează tot restul cererii, inclusiv serviciile și activitățile în prim-plan.
Utilizarea de fire de fond - o condiție necesară, dacă doriți să evitați caseta de dialog pentru a forța aplicația este închisă. Când sunt active în Android timp de 5 secunde nu răspunde la evenimente de intrare de utilizator (cum ar fi apăsarea unui buton) sau receptorul intențiilor de difuzare nu se închide handler onReceive () în decurs de 10 secunde, se consideră că cererea este atârnat. la toate costurile, pentru a evita astfel de situații. Utilizați fire de fundal pentru toate activitățile forței de muncă intensivă, cum ar fi lucrul cu fișiere, cereri de rețea, tranzacții, baze de date și calcule complexe.
Android oferă mai multe mecanisme pentru deplasarea funcționalitatea în fundal.
- Activity.runOnUiThread (Runnable)
- View.post (Runnable)
- View.postDelayed (Runnable, lung)
- Handlere
- AsyncTask
Deși utilizarea AsyncTask - o decizie bună, se întâmplă ca să lucreze în fundal necesar pentru a crea propriile fluxuri și să le gestioneze.
Java are un fir standard de clasă. pe care le puteți folosi după cum urmează:
Această metodă este adecvată numai pentru operațiunile asociate cu timpul. Dar nu va fi capabil de a actualiza interfața grafică.
Dacă trebuie să actualizați interfața programului, trebuie să utilizați AsyncTask. Acesta se face referire mai sus, sau puteți implementa propria clasă derivată din fir. Utilizarea Handler obiect al android.os de pachete pentru a sincroniza cu fluxul GUI înainte de actualizarea interfeței cu utilizatorul.
Puteți crea fire pentru copii și le puteți gestiona cu ajutorul clasei Handler. precum și clasele disponibile în spațiul de nume java.lang.Thread. Mai jos este un simplu cadru pentru operațiunile de transfer în firul copilului.
aplicarea deficitară
Scriem „rău“ Aplicația utilizează fluxul principal greșit. Într-o zi am scris un program pentru a număra ciorile. În acest moment, presupunem că pisicile negre care rula pe calea noastră. De ce fac ei - știința este tăcut. Statisticile pot fi colectate pentru a ajuta la rezolvarea misterului. Adăugați o activitate pe ecran buton și o etichetă de text. Codul pentru butonul de clic.
Pentru a simula un program de lucru grea pauze timp de douăzeci de secunde, iar apoi se afișează textul cu pisici de numărare. Dacă apăsați butonul o dată și așteptați douăzeci de secunde, programul va funcționa conform așteptărilor. Dar imaginați-vă că ați apăsat butonul o dată. Programul a lansat o pauză. Nu sunt în așteptare pentru sfârșitul pauzei, apăsați din nou butonul. Programul ar trebui să ruleze echipa, dar comanda anterioară nu a fost încă îndeplinite și vine în conflict. Încercați să apăsați butonul de câteva ori cu câteva întreruperi. La un moment dat, atârnă de aplicare și afișează caseta de dialog de sistem:
În aplicațiile reale, această fereastră poate deranja utilizatorul și el va pune un scor rau pentru aplicația dumneavoastră.
Ai nevoie pentru a muta sarcina consumatoare de timp într-un fir separat. Pentru această clasă este instanțiat Runnable. care are o metoda run (). este creat obiectul Subiect următor. designerul care a creat specificat Runnable. Ulterior, un nou flux poate fi pornit prin metoda de pornire (). Rescrieți exemplu.
Tot codul ne-am mutat la metoda run (). Acum puteți, fără oprire să faceți clic pe butonul. În acest moment, aplicația își va păstra performanțele sale. Pentru a vedea acest lucru în codul adăugat logare) busteni (Log.i. De fiecare dată când faceți clic, creați un nou fir care execută cod. Curente nu interferează unele cu altele și așteaptă rândul lor, sistemul le va permite să lucreze.
Am nevoie de un mediator între fluxul creat și principalul UI-stream. În rolul mediatorului este o clasă Handler (numele complet android.os.Handler clasa. Nu amestecați). Trebuie să creați o instanță a clasei și specificați codul care urmează să fie executat.
După linia de cod cu metoda Log.i (), se adaugă un apel la un intermediar.
Alimentarea este un intermediar, care, la rândul său actualizează interfața. În acest caz, mediatorul trimite un mesaj gol din fluxul.
Dar se întâmplă că fluxul necesar pentru a obține informațiile de prelucrare. Mai jos este un exemplu simplificat.
Rularea curs de apa
Să presupunem că vom dezvolta un player personalizat. Avem un buton de redare. care determină metoda de redare () pentru a reda muzică:
Acum vom rula metoda într-un alt fir. În primul rând, este creat un nou fir. În continuare, un flux de constructor obiect Runnable. Și noi numim metoda de redare () generat intern de flux. Și, în sfârșit, începe un fir.
acalmie alimentare
Uneori este necesar să se oprească temporar fluxul ( „pus la somn“):
fluxurile prioritare
setPriority () metoda este utilizată pentru a seta procesul de prioritate. care este cauzat de a începe fluxul de. Valoarea de prioritate poate varia de la Thread.MIN_PRIORITY (1) până la Thread.MAX_PRIORITY (10):
Anularea fluxului
Flux are metoda stop (). dar utilizarea sa nu este recomandată, pentru că lasă cererea într-o stare incertă. În general, se utilizează această abordare:
Există un alt mod, atunci când toate fluxurile declanșate declarate demoni. În acest caz, toate fluxurile deschise sunt completate automat la sfârșitul fluxului principal al aplicației: