Sobes.tech
Junior

Androidda asosiy oqim qanday ishlaydi?

sobes.tech AI

AIdan javob

Android'da Asosiy oqim (Main Thread), shuningdek, UI Thread deb ham ataladi, yagona oqim bo'lib:

  • Foydalanuvchi interfeysining barcha voqealarini (tugmalar bosilishi, skroll qilish) ishlaydi.
  • Ekrandagi elementlarni chizadi.
  • Komponentlarning hayot aylanishi kodini bajaradi (Activity, Fragment).

Ilova ishga tushirilganda, Android asosiy oqimni yaratadi. Barcha foydalanuvchi interfeysi komponentlari faqat bu oqimda yaratiladi va yangilanadi.

Asosiy tushunchalar:

  • Event Loop: Asosiy oqim doimiy ravishda xabarlar (UI voqealari, chizish vazifalari) MessageQueue navbatidan olib, mos Handlerlarga yuboradi.
  • Looper: Looper obyekti oqim bilan bog'langan va bu xabarlarni ishlash tsikmini boshqaradi.
  • Handler: Handler obyekti Message va Runnable obyektlarini bog'langan oqimda yuborish va ishlash imkonini beradi, odatda, UI bilan boshqa oqimlar o'rtasida aloqa uchun asosiy oqimda yaratiladi.

Muammolar:

  • ANR (Application Not Responding): Agar asosiy oqimda uzoq davom etadigan operatsiya bajarilsa, u bloklanadi, UI voqealarini ishlamaydi va ekran chizilmaydi. Bu ilovaning to'xtashiga va ANR dialogining ko'rsatilishiga olib keladi. Tipik ANRni chaqiradigan davomiylik — 5 soniya.

Yechim:

  • Uzoq davom etadigan operatsiyalarni (tarmoq so'rovlar, ma'lumotlar bazasi bilan ishlash, murakkab hisob-kitoblar) fon oqimlarda bajarish.
  • UI ni fon oqimlardan yangilash uchun o'zaro aloqa mexanizmlaridan foydalanish (masalan, Handler, AsyncTask, Coroutines).
// Fon oqimidan UI ni yangilash uchun Handler misoli
Handler mainHandler = new Handler(Looper.getMainLooper());

new Thread(new Runnable() {
    @Override
    public void run() {
        // Uzoq davom etadigan operatsiyani fon oqimida bajarish
        // ...

        // UI ni yangilash uchun vazifa yuborish
        mainHandler.post(new Runnable() {
            @Override
            public void run() {
                // Asosiy oqimda UI ni yangilash
                // ...
            }
        });
    }
}).start();
// Coroutines yordamida fon oqimidan UI ni yangilash misoli
import kotlinx.coroutines.*

fun fetchDataAndUpdateUI() {
    CoroutineScope(Dispatchers.IO).launch {
        // Uzoq davom etadigan operatsiyani fon oqimida bajarish
        val data = fetchDataFromServer()

        // UI ni yangilash uchun asosiy oqimga o'tish
        withContext(Dispatchers.Main) {
            updateUI(data)
        }
    }
}