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:
- Припрема: У нитки се позива
Looper.prepare(). Ово креира нови примерак Looper-а и повезује га са тренутном нитју. Такође се креира MessageQueue за овај Looper. - Покретање циклуса: Позива се
Looper.loop(). Овај метод улази у бесконачни циклус (докле не буде завршен). У циклусу, Looper стално проверава MessageQueue за нове поруке. - Обрада порука: Нађена порука, Looper је извлачи и шаље Handler-у који је додао у ред. Handler извршава одговарајући задатак (на пример, позива метод
handleMessage()илиrun()за Runnable). - Завршетак: За излазак из циклуса и завршетак 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();