Sobes.tech
Junior

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

sobes.tech AI

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

Հիմնական հոսքը (Main Thread) Android-ում, որը նաև հայտնի է որպես UI Thread, միակ հոսքն է, որը՝

  • Հաշվարկում է բոլոր օգտագործողի ինտերֆեյսի իրադարձությունները (կոճակների սեղմումներ, սքրոլներ):
  • Դիզայնում է տարրերը էկրանին:
  • Կատարում է կյանքի ցիկլի կոդը (Activity, Fragment):

Երբ ծրագիրը սկսվում է, Android-ը ստեղծում է գլխավոր հոսքը: Բոլոր օգտագործողի ինտերֆեյսի տարրերը ստեղծվում և թարմացվում են միայն այս հոսքում:

Հիմնական հասկացություններ՝

  • Event Loop: Հիմնական հոսքը աշխատում է ցիկլում, մշտապես հանում է հաղորդագրություններ (UI իրադարձություններ, նկարազարդման առաջադրանքներ) MessageQueue հերթից և ուղարկում դրանք համապատասխան մշակողներին (Handler):
  • Looper: Looper օբյեկտը կապված է հոսքի հետ և կառավարում է այս հաղորդագրությունների մշակման ցիկլը:
  • Handler: Handler օբյեկտը թույլ է տալիս ուղարկել և մշակել Message և Runnable օբյեկտները կապված MessageQueue հոսքում, որտեղ այն ստեղծվել է: Հաճախ Handler-ը ստեղծվում է գլխավոր հոսքում՝ UI-ի հետ փոխազդելու համար այլ հոսքերից:

Խնդիրներ՝

  • ANR (Application Not Responding): Եթե երկարատև գործողություն կատարվում է հիմնական հոսքում, այն բլոկվում է, չի մշակվում UI իրադարձությունները և չի նկարազարդում էկրանը: Սա հանգեցնում է ծրագրի կախվածության և ANR-դիալոգի: Տիպիկ տևողությունը, որը հանգեցնում է ANR-ի գլխավոր հոսքում UI-ի հետ աշխատելիս, — 5 վայրկյան:

Որոշումներ՝

  • Երկարատև գործողությունները (ներգծանցային հարցումներ, տվյալների բազայի աշխատանք, բարդ հաշվարկներ) կատարել ֆոնային հոսքերում:
  • Օգտագործել միջհոսքային փոխազդեցության մեխանիզմներ UI- ի թարմացման համար ֆոնային հոսքերում (օրինակ, Handler, AsyncTask, Coroutines):
// Օրինակ `Handler`-ի օգտագործում UI- ի թարմացման համար ֆոնային հոսքից
Handler mainHandler = new Handler(Looper.getMainLooper());

new Thread(new Runnable() {
    @Override
    public void run() {
        // Դլատև գործողության կատարում ֆոնային հոսքում
        // ...

        // UI թարմացման առաջադրանքի ուղարկում գլխավոր հոսք
        mainHandler.post(new Runnable() {
            @Override
            public void run() {
                // UI թարմացում գլխավոր հոսքում
                // ...
            }
        });
    }
}).start();
// Կորուտինների օգտագործման օրինակ UI թարմացման համար ֆոնային հոսքից
import kotlinx.coroutines.*

fun fetchDataAndUpdateUI() {
    CoroutineScope(Dispatchers.IO).launch {
        // Դլատև գործողության կատարում ֆոնային հոսքում
        val data = fetchDataFromServer()

        // Կտտանցում գլխավոր հոսք UI- ի համար
        withContext(Dispatchers.Main) {
            updateUI(data)
        }
    }
}