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 диалогына әкеледі. Әдетте, UI-мен жұмыс істегенде ANR-ді шақыратын ұзақ уақыт — 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)
        }
    }
}