Sobes.tech
Junior

Mis on Looper Androidis?

sobes.tech AI

Vastus AI-lt

Looper on Androidi klass, mis võimaldab juhtida niiti (Thread) ja muuta selle "Looping" (tsükliliseks). See valmistab niidi ette sõnumite (Message) järjekorrast (MessageQueue) töötlemiseks, kuni see on selgelt lõpetatud.

Looperi peamised komponendid:

  • MessageQueue: järjekord, mis hoiab sõnumeid (Message) ja ülesandeid (Runnable), mida tuleb niidis töödelda. See on niit-turvaline struktuur.
  • Looper: ühendab niidi MessageQueue-ga ja tsükliliselt võtab sõnumeid välja, et neid edasi töödelda.
  • Handler: objekt, mis asetab sõnumeid ja ülesandeid MessageQueue-sse ning töötab nende välja võtmise ajal. Handler on seotud konkreetse Looperiga.

Kuidas Looper töötab:

  1. Valmistamine: Niidis kutsutakse Looper.prepare(). See loob uue Looper eksemplari ja seob selle jooksva niidiga. Samuti luuakse MessageQueue selle Looperi jaoks.
  2. Tsükli käivitamine: Kutsutakse Looper.loop(). See meetod siseneb lõpmatusse tsüklisse (kuni Looper lõpetatakse). Tsükli jooksul kontrollib Looper pidevalt MessageQueue-d uute sõnumite jaoks.
  3. Sõnumite töötlemine: Kui sõnum leitakse, võtab Looper selle välja ja saadab Handlerile, kes on selle lisanud järjekorda. Handler täidab vastava ülesande (näiteks kutsub välja handleMessage() või run() Runnable jaoks).
  4. Lõpetamine: Tsüklist väljumiseks ja Looperi lõpetamiseks tuleb kutsuda Looper.quit() või Looper.quitSafely().

Looperi tüüpiline kasutus:

  • Taustapõhised niidid, mis peavad täitma ülesandeid asünkroonselt ja saama sõnumeid UI-niidist või teistest niitidest.
  • Kasutamine teenustes (näiteks IntentService kasutab sisseehitatud Looperit).
  • Töötamine HandlerThread-iga (eriline niidi klass, mis loob oma Looperi ja MessageQueue).

Näide Looperi ja Handleri loomise kohta:

// Niidi loomine ja selle käivitamine
HandlerThread handlerThread = new HandlerThread("MyWorkerThread");
handlerThread.start();

// Looper saamine niidist
Looper looper = handlerThread.getLooper();

// Handleri loomine, mis on seotud Looperiga
Handler handler = new Handler(looper) {
    @Override
    public void handleMessage(Message msg) {
        // Töötamine sõnumitega tööniidis
        // msg.what sisaldab sõnumi identifikaatorit
        // msg.obj või msg.data võivad sisaldada andmeid
        switch (msg.what) {
            case 1:
                // Töötada sõnumit tüüpi 1
                break;
            case 2:
                // Töötada sõnumit tüüpi 2
                break;
        }
    }
};

// Sõnumi saatmine tööniidile
handler.sendEmptyMessage(1);

// Või Runnable'i käivitamine
handler.post(new Runnable() {
    @Override
    public void run() {
        // Kood, mis täidetakse tööniidis
    }
});

// Kui niit enam ei ole vajalik, lõpetame Looperi ja niidi
handlerThread.quitSafely();