Od jednog jela do celog restorana
U našim prethodnim lekcijama, kuhinja je postala mašina za obradu pojedinačnih narudžbina. Gost zatraži jednu stvar, a suspend
funkcija vrati jedan rezultat.
Ali pravi restoran je mnogo složeniji. To je dinamično okruženje sa više tokova informacija:
- Švedski sto na koji se neprestano iznose nova jela.
- Barmen i kuvar koji moraju da sinhronizuju porudžbinu hrane i pića.
- Tabla sa statusom uživo kako bi gosti mogli da prate svoju porudžbinu.
- Razglas za objave osoblju.
suspend
funkcije nisu dovoljne za ovo. Da bismo upravljali višestrukim vrednostima tokom vremena, potrebna nam je biblioteka za korutine: Kotlin Flow.
Švedski sto: Flow
(hladni strim)
Flow
je asinhroni strim vrednosti. Zamislite ga kao švedski sto. Kuvar (producer
) postavlja jela na liniju jedno po jedno (emit-uje vrednosti), a gost (consumer
) uzima svako jelo kako postane dostupno (collect-uje vrednosti).
Ključno je da je standardni Flow
hladan. To znači da kuvar ne počinje da kuva dok se gost ne pojavi da preuzme jelo. Ako niko ne preuzima, nikakav posao se ne obavlja. To ga čini izuzetno efikasnim.
|
|
Kuvar počinje da kuva tek kada se pozove .collect
, a tok se prirodno završava kada kuvar više nema jela za emit
-ovanje.

Orkestriranje obroka: Napredni Flow operatori
Pravom restoranu je potrebno da kombinuje različite tokove. Flow
pruža bogat skup operatora za to.
Uparivanje jela i pića pomoću zip
-a
Gost naručuje kompletan obrok: jelo i piće. Kuvar priprema hranu, a barmen piće.
Moraju se poslužiti zajedno kao par. To je posao zip
-a. On kombinuje dva toka tako što uparuje njihove odgovarajuće elemente.
|
|
Izlaz:
|
|
zip
čeka dok ne dobije novu stavku iz oba toka pre nego što emituje kombinovani rezultat. Zaustavlja se čim se jedan od tokova završi.

Tabla sa menijem uživo pomoću combine
-a
Zamislite digitalnu tablu sa menijem. Ona treba da prikazuje “Jelo dana”, koje se menja na svakih nekoliko sekundi. Takođe treba da prikazuje “Trenutnu cenu”, koja se zasniva na tržišnim troškovima i ažurira se u drugačijem intervalu.
Operator combine
je savršen za ovo. On kombinuje poslednju vrednost iz svakog toka svaki put kada jedan od njih emituje novu vrednost.
|
|
Izlaz:
|
|
Ovo je izuzetno korisno za korisnički interfejs (UI) gde je potrebno kombinovati više izvora podataka da bi se prikazao ekran.

Tabla sa statusom porudžbine: StateFlow
(vrući strim)
Naš švedski sto (Flow
) je bio hladan. Ali šta je sa podacima koji postoje bez obzira da li ih neko gleda ili ne, kao što je status porudžbine? Za to je potreban vrući strim.
StateFlow
je kao velika digitalna tabla sa statusom porudžbine.
- Vruć je: Uvek je aktivan i uvek ima vrednost (npr. “Porudžbina primljena”).
- Čuva samo poslednju vrednost. Stari statusi su zauvek nestali.
- Novi posmatrači odmah dobijaju trenutni status, a zatim i sva buduća ažuriranja.
StateFlow
je standardni alat za upravljanje stanjem UI-a u ViewModel-u.
|
|

Razglas: SharedFlow
(vrući strim za događaje)
StateFlow
je za stanje. Ali šta je sa jednokratnim događajima (events), poput “Plaćanje uspešno” toast poruke ili komande za navigaciju?
Ako koristimo StateFlow
, rotacija ekrana može dovesti do ponovnog prikazivanja događaja.
Za događaje nam je potreban SharedFlow
. Zamislite ga kao razglas u kuhinji.
- Vruć je: Razglas je uvek uključen.
- Emituje događaje svim trenutnim slušaocima.
- Podrazumevano, novi slušaoci ne primaju stare objave.
Ovo je savršeno za prikazivanje snackbar-a ili navigaciju na novi ekran tačno jednom.
|
|

Zaključak
Flow
: Hladni strim za podatke na zahtev, poput švedskog stola. Koristite ga za pozive repozitorijuma koji preuzimaju podatke iz baze ili sa mreže.- Napredni operatori:
zip
: Uparuje stavke iz više strimova jedan-na-jedan.combine
: Kreira novu vrednost od poslednje stavke svakog strima. Ključan za reaktivne UI-je.
StateFlow
: Vrući strim za predstavljanje stanja UI-a, poput table sa statusom. Koristite ga za čuvanje stanja ekrana u vašem ViewModel-u.SharedFlow
: Vrući strim za emitovanje jednokratnih događaja, poput razglasa. Koristite ga za slanje događaja kao što su toast poruke ili komande za navigaciju iz vašeg ViewModel-a.
Šta nas čeka u četvrtom delu?
Naš restoran je sada efikasan, obrađuje složene porudžbine i tokove informacija. Ali do sada smo radili pod idealnim uslovima. Šta se dešava kada nastane večernja gužva i naš sistem se nađe pod stvarnim opterećenjem?
Moramo našu efikasnu kuhinju pretvoriti u zaista otpornu operaciju spremnu za produkciju.
- Šta se dešava kada kuhinja (proizvođač) proizvodi jela brže nego što konobari (potrošači) mogu da ih posluže? Da li bacamo jela na pod ili imamo strategiju? To je backpressure.
- Kako da osiguramo da intenzivno seckanje i kuvanje (
Dispatchers.IO
) nikada ne ometa delikatan posao postavljanja tanjira i serviranja (Dispatchers.Main
)? Videćemo operatorflowOn
. - Ako se jedno jelo u neprekidnom toku pripremi pogrešno, kako možemo da obradimo tu grešku pomoću
catch
operatora, a da ne ugasimo ceo švedski sto?
U sledećem delu, zaronićemo u napredne operatore i koncepte koji čine Flow
dovoljno robusnim za svaki scenario koji mu možete postaviti.