Junior
Androidдеги Looper деген эмне?
sobes.tech AI
AIден жооп
Looper — бул Androidдеги класс, ал потокту (Thread) башкаруу үчүн колдонулат жана аны "Looping" (циклдүү) кылат. Ал потокту MessageQueue (Хабарлар кезеги) аркылуу билдирүүлөрдү иштетүүгө даярдайт, андан кийин аны ачык түрдө аяктагандан кийин гана токтотулат.
Looperдун негизги компоненттери:
- MessageQueue: билдирүүлөрдү (Message) жана тапшырмаларды (Runnable) сактайт, аларды Looper потокунда иштетүү үчүн. Бул потокко коопсуз структура.
- Looper: потокту MessageQueue менен байланыштырып, кезектеги билдирүүлөрдү үзгүлтүксүз алып чыгат жана иштетет.
- Handler: объект, ал MessageQueueга билдирүүлөрдү жана тапшырмаларды салат жана аларды кезекке алып чыгып иштетет. Handler белгилүү бир Looper менен байланышкан.
Looper кандай иштейт:
- Даярдоо: Потокто
Looper.prepare()чакырылат. Бул жаңы Looper экземплярын түзүп, аны учурдагы потокко байланыштырат. Ошондой эле, бул Looper үчүн MessageQueue түзүлөт. - Циклди баштоо:
Looper.loop()чакырылат. Бул метод чексиз циклге кирет (Looper аяктагандан кийин гана чыгат). Цикл ичинде Looper үзгүлтүксүз MessageQueueда жаңы билдирүүлөрдү текшерет. - Билдирүүлөрдү иштетүү: Билдирүү табылса, Looper аны чыгарып, Handlerге жиберет, ал аны кезекке кошкон. Handler тиешелүү тапшырманы аткарат (мисалы,
handleMessage()же Runnable үчүнrun()чакыруу). - Аякталышы: Циклден чыгуу жана 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();
// Looperге байланышкан Handler түзүү
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();