Sobes.tech
Junior

Šta je Looper u Androidu?

sobes.tech АИ

Одговор од АИ

Looper је класа у Android-у која се користи за управљање нитју (Thread), чинећи је "Looping" (циклус). Он припрема нит за обраду порука из MessageQueue-а све док се не заврши експлицитно.

Главне компоненте Looper-а:

  • MessageQueue: ред који чува поруке (Message) и задатке (Runnable) за извршавање у нитји Looper-а. Ово је структура која је безбедна за нитове.
  • Looper: повезује нит са MessageQueue-ом и циклично извлачи поруке из реда за њихову даљу обраду.
  • Handler: објекат који поставља поруке и задатке у MessageQueue Looper-а и их обрађује при извлачењу из реда. Handler је повезан са одређеним Looper-ом.

Како ради Looper:

  1. Припрема: У нитки се позива Looper.prepare(). Ово креира нови примерак Looper-а и повезује га са тренутном нитју. Такође се креира MessageQueue за овај Looper.
  2. Покретање циклуса: Позива се Looper.loop(). Овај метод улази у бесконачни циклус (докле не буде завршен). У циклусу, Looper стално проверава MessageQueue за нове поруке.
  3. Обрада порука: Нађена порука, Looper је извлачи и шаље Handler-у који је додао у ред. Handler извршава одговарајући задатак (на пример, позива метод handleMessage() или run() за Runnable).
  4. Завршетак: За излазак из циклуса и завршетак Looper-а, потребно је позвати Looper.quit() или Looper.quitSafely().

Типична употреба Looper-а:

  • Креирање позадинских нитова који треба да извршавају задатке асинхроно и примају поруке из UI нит-а или других нитова.
  • Коришћење у сервисима (IntentService користи уграђени Looper).
  • Рад са HandlerThread (посебна класа за нит која креира свој Looper и MessageQueue).

Пример креирања нити са Looper-ом и Handler-ом:

// Креирање нити и њено покретање
HandlerThread handlerThread = new HandlerThread("MyWorkerThread");
handlerThread.start();

// Добијање Looper-а из нити
Looper looper = handlerThread.getLooper();

// Креирање Handler-а повезаног са Looper-ом
Handler handler = new Handler(looper) {
    @Override
    public void handleMessage(Message msg) {
        // Обрада порука у радној нити
        // msg.what садржи идентификатор поруке
        // msg.obj или msg.data могу садржати податке
        switch (msg.what) {
            case 1:
                // Обрада поруке типа 1
                break;
            case 2:
                // Обрада поруке типа 2
                break;
        }
    }
};

// Пошаљи поруку у радну нит
handler.sendEmptyMessage(1);

// Или изврши Runnable
handler.post(new Runnable() {
    @Override
    public void run() {
        // Код који се извршава у радној нит
    }
});

// Када више није потребна, заустави Looper и нит
handlerThread.quitSafely();