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)
MessageQueuenavbatidan olib, mosHandlerlarga yuboradi. - Looper:
Looperobyekti oqim bilan bog'langan va bu xabarlarni ishlash tsikmini boshqaradi. - Handler:
HandlerobyektiMessagevaRunnableobyektlarini 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)
}
}
}