Sobes.tech
Junior

Kuidas töötab Androidis peamine niit?

sobes.tech AI

Vastus AI-lt

Peamine voog (Main Thread) Androidis, tuntud ka UI Thread, on ainus voog, mis:

  • Töötleb kõiki kasutajaliidese sündmusi (nupuvajutused, kerimine).
  • Joonistab elemendid ekraanile.
  • Täidab komponendi elutsükli koodi (Activity, Fragment).

Kui rakendus käivitub, loob Android peamise voogu. Kõik kasutajaliidese komponendid luuakse ja uuendatakse ainult selles voos.

Põhikonseptsioonid:

  • Event Loop: Peamine voog töötab tsüklis, pidevalt tõmmates sõnumeid (UI sündmused, joonistamise ülesanded) MessageQueue järjekorrast ja saadab need vastavatele töötlejatele (Handler).
  • Looper: Looper objekt on seotud vooguga ja haldab seda sõnumite töötlemise tsüklit.
  • Handler: Handler võimaldab saata ja töödelda Message ja Runnable objekte seotud MessageQueue voos, kus see loodi. Tavaliselt luuakse Handler peamise vooga UI-ga suhtlemiseks teistest voogudest.

Probleemid:

  • ANR (Application Not Responding): Kui pikk operatsioon toimub peamise voogu, blokeeritakse see, ei töödelda UI sündmusi ja ekraani ei joonistata. See põhjustab rakenduse hangumise ja ANR dialoogi. Tüüpiline aeg, mis põhjustab ANR-i peamise voogu UI-ga töötades, on 5 sekundit.

Lahendused:

  • Pikkade operatsioonide (võrgu päringud, andmebaasiga töötamine, keerulised arvutused) teostamine taustvoogudes.
  • Kasutades vahendeid vahevoogude vahelise suhtluse jaoks UI uuendamiseks taustavoogudest (näiteks Handler, AsyncTask, Coroutines).
// Näide Handleri kasutamisest UI uuendamiseks taustvoogudest
Handler mainHandler = new Handler(Looper.getMainLooper());

new Thread(new Runnable() {
    @Override
    public void run() {
        // Pikk operatsioon taustvoogus
        // ...

        // Ülesande saatmine UI uuendamiseks peamisele voogule
        mainHandler.post(new Runnable() {
            @Override
            public void run() {
                // UI uuendamine peamise voogu
                // ...
            }
        });
    }
}).start();
// Näide korutinate kasutamisest UI uuendamiseks taustvoogudest
import kotlinx.coroutines.*

fun fetchDataAndUpdateUI() {
    CoroutineScope(Dispatchers.IO).launch {
        // Pikk operatsioon taustvoogus
        val data = fetchDataFromServer()

        // Üleminek peamisele voogule UI uuendamiseks
        withContext(Dispatchers.Main) {
            updateUI(data)
        }
    }
}