Sobes.tech
Junior

Ի՞նչ է Looper-ը Android-ում։

sobes.tech AI

Պատասխան AI-ից

Looper — դա Android-ում դաս է, որը օգտագործվում է հոսքի (Thread) կառավարելու համար՝ դարձնելով այն "Looping" (շրջանաձև): Այն պատրաստում է հոսքը հաղորդագրությունների հերթից (MessageQueue) մշակելու համար, մինչև որ այն բացահայտորեն չվերջացվի:

Looper-ի հիմնական բաղադրիչները՝

  • MessageQueue: հերթ, որը պահում է հաղորդագրություններ (Message) և առաջադրանքներ (Runnable) Looper հոսքում կատարելու համար: Սա հոսք-անվտանգ կառուցվածք է:
  • Looper: կապում է հոսքը MessageQueue-ի հետ և ցիկլային կերպով հանում է հաղորդագրությունները՝ դրանց հետագա մշակման համար:
  • Handler: օբյեկտ, որը տեղադրում է հաղորդագրություններն ու առաջադրանքները MessageQueue-ում և մշակվում է դրանց հանման ժամանակ: Handler-ը կապված է կոնկրետ Looper-ի հետ:

Ինչպես է աշխատում Looper-ը:

  1. Պատրաստում: Հոսքում կանչվում է Looper.prepare(): Սա ստեղծում է նոր Looper օրինակ և կապում այն ընթացիկ հոսքի հետ: Միևնույն ժամանակ, ստեղծվում է MessageQueue այդ Looper-ի համար:
  2. Ցիկլի մեկնարկ: Կոչվում է Looper.loop(): Այս մեթոդը մտնում է անսահմանափակ ցիկլ (մինչև որ Looper-ը չվերջացվի): Ցիկլի ընթացքում 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();