Sobes.tech
Junior

Ինչպես է աշխատում հիմնական հոսքը Android-ում?

sobes.tech AI

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

Անհրաժեշտ է նշել, որ Main Thread-ը կամ UI thread-ը Android-ում պատասխանատու է օգտագործողի ինտերֆեյսի գծագրության, մուտքային իրադարձությունների մշակման և ծրագրի մեծ մասի կոմպոնենտների (Activity, Service, Broadcast Receiver) կատարման համար:

Նրա աշխատանքը հիմնված է Looper և Handler մեխանիզմների վրա:

  1. Looper: Սա դաս է, որը ցիկլային կերպով հանում է հաղորդագրություններ (Message) հաղորդագրությունների հերթից (MessageQueue) և փոխանցում դրանց համապատասխան Handler-ին։ Յուրաքանչյուր Looper-ով աշխատող թելն է "շղթա"։ Հիմնական թելն ավտոմատ կերպով ստեղծվում է Looper-ով:
  2. MessageQueue: Սա տվյալների կառուցվածք է, որը պահում է հաղորդագրությունների ցանկը, որոնք պետք է մշակվեն։ Հաղորդագրությունները կարող են պարունակել տվյալներ (օբյեկտներ, primitives) և հղում Handler-ին, որը պետք է դրանք մշակի:
  3. Handler: Սա դաս է, որը կապված է թելի Looper-ի և MessageQueue-ի հետ։ Այն թույլ է տալիս ուղարկել հաղորդագրություններ MessageQueue-ին և մշակել Looper-ի կողմից հանած հաղորդագրությունները։ Handler-ը կարող է ուղարկել հաղորդագրություններ ինչպես իր սեփական թելին (օրինակ՝ ծրագրավորելով առաջադրանքներ), այնպես էլ այլ թելերին՝ Looper-ով:

Աշխատանքի սկզբունքը՝

  1. Հիմնական թելի Looper-ը սկսվում է և անընդհատ մշակվում է loop() ցիկլը:
  2. Սիստեմը կամ այլ թելեր ուղարկում են հաղորդագրություններ (օրինակ՝ հպման իրադարձություններ, հաղորդագրություններ Activity-ի կյանքի ցիկլի մասին) հիմնական թելին՝ Handler-ների միջոցով:
  3. Looper-ը հանում է հաջորդ հաղորդագրությունը MessageQueue-ից:
  4. Looper-ը փոխանցում է հաղորդագրությունը համապատասխան Handler-ին:
  5. Handler-ը մշակում է հաղորդագրությունը՝ իրականացնելով համապատասխան տրամաբանությունը (օրինակ՝ UI-ի թարմացում):

Մեծ կարևորություն ունի՝

Բոլոր գործողությունները, որոնք կապված են UI-ի թարմացման հետ, պետք է կատարվեն միայն հիմնական թելում։ Լայնածավալ գործողությունների (միջանցքային հարցումներ, ֆայլերի աշխատանք) կատարման դեպքում, դա կարող է հանգեցնել բլոկավորման (ANR - Application Not Responding) և ծրագրի սառեցման։ Այդպիսի գործողությունների համար անհրաժեշտ է օգտագործել աշխատանքային թելեր (օրինակ՝ Coroutines, RxJava, ExecutorService, AsyncTask):