Junior
Ի՞նչ է Looper-ը Android-ում։
sobes.tech AI
Պատասխան AI-ից
Looper — դա Android-ում դաս է, որը օգտագործվում է հոսքի (Thread) կառավարելու համար՝ դարձնելով այն "Looping" (շրջանաձև): Այն պատրաստում է հոսքը հաղորդագրությունների հերթից (MessageQueue) մշակելու համար, մինչև որ այն բացահայտորեն չվերջացվի:
Looper-ի հիմնական բաղադրիչները՝
- MessageQueue: հերթ, որը պահում է հաղորդագրություններ (Message) և առաջադրանքներ (Runnable) Looper հոսքում կատարելու համար: Սա հոսք-անվտանգ կառուցվածք է:
- Looper: կապում է հոսքը MessageQueue-ի հետ և ցիկլային կերպով հանում է հաղորդագրությունները՝ դրանց հետագա մշակման համար:
- Handler: օբյեկտ, որը տեղադրում է հաղորդագրություններն ու առաջադրանքները MessageQueue-ում և մշակվում է դրանց հանման ժամանակ: Handler-ը կապված է կոնկրետ Looper-ի հետ:
Ինչպես է աշխատում Looper-ը:
- Պատրաստում: Հոսքում կանչվում է
Looper.prepare(): Սա ստեղծում է նոր Looper օրինակ և կապում այն ընթացիկ հոսքի հետ: Միևնույն ժամանակ, ստեղծվում է MessageQueue այդ Looper-ի համար: - Ցիկլի մեկնարկ: Կոչվում է
Looper.loop(): Այս մեթոդը մտնում է անսահմանափակ ցիկլ (մինչև որ Looper-ը չվերջացվի): Ցիկլի ընթացքում 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();