Sobes.tech
Junior

Kaip veikia pagrindinis srautas Android?

sobes.tech AI

Atsakymas iš AI

Pagrindinis srautas (Main Thread) arba UI srautas Android atsako už naudotojo sąsajos atvaizdavimą, įvykių apdorojimą ir didžiąją dalį programos komponentų (Activity, Service, Broadcast Receiver) vykdymo.

Jo veikimas grindžiamas Looper ir Handler mechanizmu.

  1. Looper: Tai klasė, kuri cikliškai ištraukia pranešimus (Message) iš MessageQueue eilės ir perduoda juos apdorojimui atitinkamam Handler'ui. Kiekvienas srautas, turintis Looper, yra "peliukas". Pagrindinis srautas sukuriamas automatiškai su Looper.
  2. MessageQueue: Tai duomenų struktūra, sauganti pranešimų sąrašą, kurie turi būti apdoroti. Pranešimai gali turėti duomenų (objektų, primityvų) ir nuorodą į Handler, kuris juos turi apdoroti.
  3. Handler: Tai klasė, susieta su srauto Looper ir MessageQueue. Ji leidžia siųsti pranešimus į MessageQueue ir apdoroti iš Looper gautus pranešimus. Handler gali siųsti pranešimus kaip savo srautui (pavyzdžiui, užduočių planavimui) arba kitų srautų su Looper.

Veikimo principas:

  1. Pagrindinio srauto Looper paleidžiamas ir nuolat vykdo loop() ciklą.
  2. Sistema arba kiti srautai siunčia pranešimus (pavyzdžiui, lietimo įvykiai, Activity gyvavimo ciklo pranešimai) per Handler'ius į MessageQueue.
  3. Looper ištraukia kitą pranešimą iš MessageQueue.
  4. Looper perduoda pranešimą susietam Handler'ui.
  5. Handler apdoroja pranešimą, vykdydamas atitinką logiką (pavyzdžiui, UI atnaujinimą).

Svarbu: Visi veiksmai, susiję su UI atnaujinimu, turi būti vykdomi tik pagrindiniame sraute. Ilgalaikės operacijos (tinklo užklausos, failų tvarkymas) vykdymas pagrindiniame sraute sukels jo užblokavimą (ANR - Programos neatsako) ir programos užšalimą. Tokiems veiksmams naudokite darbo srautus (pavyzdžiui, su Coroutines, RxJava, ExecutorService, AsyncTask).