Sobes.tech
Junior

Kas ir Looper Android?

sobes.tech AI

Atbilde no AI

Looper ir klase Android, kas tiek izmantota, lai pārvaldītu pavedienu (Thread), padarot to "Looping" (ciklisks). Tas sagatavo pavedienu, lai apstrādātu ziņojumus no MessageQueue, līdz tas tiek skaidri pabeigts.

Galvenās Looper sastāvdaļas:

  • MessageQueue: rinda, kas glabā ziņojumus (Message) un uzdevumus (Runnable), kas jāizpilda Looper pavedienā. Tā ir pavedienu droša struktūra.
  • Looper: sasaista pavedienu ar MessageQueue un cikliski izvelk ziņojumus no rindas to tālākai apstrādei.
  • Handler: objekts, kas ievieto ziņojumus un uzdevumus MessageQueue un apstrādā tos, kad tie tiek izvilkti no rindas. Handler ir saistīts ar konkrētu Looper.

Kā darbojas Looper:

  1. Sagatavošana: Pavedienā tiek izsaukts Looper.prepare(). Tas izveido jaunu Looper eksemplāru un sasaista to ar pašreizējo pavedienu. Tiek izveidota arī MessageQueue šim Looper.
  2. Cikla sākšana: Tiek izsaukts Looper.loop(). Šī metode ieiet bezgalīgā ciklā (kamēr Looper netiek pabeigts). Cikla laikā Looper pastāvīgi pārbauda MessageQueue, vai ir jaunas ziņas.
  3. Ziņojumu apstrāde: Atrodot ziņu, Looper to izvelk un nosūta Handler, kurš to ir pievienojis rindai. Handler veic atbilstošu uzdevumu (piemēram, izsauc handleMessage() vai run() Runnable).n
  4. Beigšana: Lai izietu no cikla un pabeigtu Looper, ir jāizsauc Looper.quit() vai Looper.quitSafely().

Tipisks Looper izmantošanas veids:

  • Izveidot fonu pavedienus, kas veic uzdevumus asenhroni un saņem ziņojumus no UI pavediena vai citiem pavedieniem.
  • Izmantot pakalpojumos (piemēram, IntentService izmanto iebūvētu Looper).
  • Darbs ar HandlerThread (speciāla pavediena klase, kas izveido savu Looper un MessageQueue).

Piemērs, kā izveidot pavedienu ar Looper un Handler:

// Pavediena izveide un palaišana
HandlerThread handlerThread = new HandlerThread("MyWorkerThread");
handlerThread.start();

// Looper iegūšana no pavediena
Looper looper = handlerThread.getLooper();

// Handler izveide, kas ir saistīts ar Looper
Handler handler = jaHandler(looper) {
    @Override
    public void handleMessage(Message msg) {
        // Apstrādāt ziņojumus darba pavedienā
        // msg.what satur ziņojuma identifikatoru
        // msg.obj vai msg.data var saturēt datus
        switch (msg.what) {
            case 1:
                // Apstrādāt ziņojumu tipa 1
                break;
            case 2:
                // Apstrādāt ziņojumu tipa 2
                break;
        }
    }
};

// Nosūtīt ziņojumu uz darba pavedienu
handler.sendEmptyMessage(1);

// Vai izpildīt Runnable
handler.post jaRunnable() {
    @Override
    public void run() {
        // Kods, kas jāizpilda darba pavedienā
    }
});

// Kad pavedienam vairs nav nepieciešams, pabeigt Looper un pavedienu
handlerThread.quitSafely();