Ինչպես է աշխատում հիմնական հոսքը Android-ում?
sobes.tech AI
Պատասխան AI-ից
Անհրաժեշտ է նշել, որ Main Thread-ը կամ UI thread-ը Android-ում պատասխանատու է օգտագործողի ինտերֆեյսի գծագրության, մուտքային իրադարձությունների մշակման և ծրագրի մեծ մասի կոմպոնենտների (Activity, Service, Broadcast Receiver) կատարման համար:
Նրա աշխատանքը հիմնված է Looper և Handler մեխանիզմների վրա:
- Looper: Սա դաս է, որը ցիկլային կերպով հանում է հաղորդագրություններ (Message) հաղորդագրությունների հերթից (MessageQueue) և փոխանցում դրանց համապատասխան Handler-ին։ Յուրաքանչյուր Looper-ով աշխատող թելն է "շղթա"։ Հիմնական թելն ավտոմատ կերպով ստեղծվում է Looper-ով:
- MessageQueue: Սա տվյալների կառուցվածք է, որը պահում է հաղորդագրությունների ցանկը, որոնք պետք է մշակվեն։ Հաղորդագրությունները կարող են պարունակել տվյալներ (օբյեկտներ, primitives) և հղում Handler-ին, որը պետք է դրանք մշակի:
- Handler: Սա դաս է, որը կապված է թելի Looper-ի և MessageQueue-ի հետ։ Այն թույլ է տալիս ուղարկել հաղորդագրություններ MessageQueue-ին և մշակել Looper-ի կողմից հանած հաղորդագրությունները։ Handler-ը կարող է ուղարկել հաղորդագրություններ ինչպես իր սեփական թելին (օրինակ՝ ծրագրավորելով առաջադրանքներ), այնպես էլ այլ թելերին՝ Looper-ով:
Աշխատանքի սկզբունքը՝
- Հիմնական թելի Looper-ը սկսվում է և անընդհատ մշակվում է
loop()ցիկլը: - Սիստեմը կամ այլ թելեր ուղարկում են հաղորդագրություններ (օրինակ՝ հպման իրադարձություններ, հաղորդագրություններ Activity-ի կյանքի ցիկլի մասին) հիմնական թելին՝ Handler-ների միջոցով:
- Looper-ը հանում է հաջորդ հաղորդագրությունը MessageQueue-ից:
- Looper-ը փոխանցում է հաղորդագրությունը համապատասխան Handler-ին:
- Handler-ը մշակում է հաղորդագրությունը՝ իրականացնելով համապատասխան տրամաբանությունը (օրինակ՝ UI-ի թարմացում):
Մեծ կարևորություն ունի՝
Բոլոր գործողությունները, որոնք կապված են UI-ի թարմացման հետ, պետք է կատարվեն միայն հիմնական թելում։ Լայնածավալ գործողությունների (միջանցքային հարցումներ, ֆայլերի աշխատանք) կատարման դեպքում, դա կարող է հանգեցնել բլոկավորման (ANR - Application Not Responding) և ծրագրի սառեցման։ Այդպիսի գործողությունների համար անհրաժեշտ է օգտագործել աշխատանքային թելեր (օրինակ՝ Coroutines, RxJava, ExecutorService, AsyncTask):