Junior
Android-də əsas axın necə işləyir?
sobes.tech Süni İntellekt
AI-dan cavab
Android-də Əsas Axın (Main Thread), həmçinin UI Thread kimi də tanınır, yeganə axındır ki:
- İstifadəçi interfeysinin bütün hadisələrini (düymələrə basma, sürüşdürmə) işləyir.
- Ekrandakı elementləri çəkir.
- Komponentlərin həyat dövrü kodunu icra edir (Activity, Fragment).
Tətbiq işə salındıqda, Android əsas axını yaradır. Bütün istifadəçi interfeysi komponentləri yalnız bu axında yaradılır və yenilənir.
Əsas anlayışlar:
- Event Loop: Əsas axın dövründə işləyir, daim mesajlar (UI hadisələri, render tapşırıqları)
MessageQueue-dən çıxarır və müvafiqHandler-lara göndərir. - Looper:
Looperobyekti axına bağlıdır və bu mesajların işlənmə dövrünü idarə edir. - Handler:
HandlerobyektiMessagevəRunnableobyektlərini onunMessageQueue-sində göndərməyə və işləməyə imkan verir, adətən, UI ilə digər axınlar arasında əlaqə üçün əsas axında yaradılır.
Məsələlər:
- ANR (Application Not Responding): Əgər əsas axında uzun müddətli əməliyyat həyata keçirilərsə, o, bloklanır, UI hadisələrini işlətmir və ekranı çəkmir. Bu, tətbiqin donmasına və ANR dialoqunun göstərilməsinə səbəb olur. UI ilə işləyərkən ANR-ə səbəb olan tipik müddət 5 saniyədir.
Həll:
- Uzun müddətli əməliyyatları (şəbəkə sorğuları, verilənlər bazası ilə işləmək, mürəkkəb hesablamalar) fon axınlarında yerinə yetirin.
- UI-ni fon axınlarından yeniləmək üçün mexanizmlərdən istifadə edin (
Handler,AsyncTask,Coroutines).
// Fon axınından UI-ni yeniləmək üçün Handler nümunəsi
Handler mainHandler = new Handler(Looper.getMainLooper());
new Thread(new Runnable() {
@Override
public void run() {
// Uzun əməliyyatı fon axınında yerinə yetirin
// ...
// UI-ni yeniləmək üçün tapşırıq göndərin
mainHandler.post(new Runnable() {
@Override
public void run() {
// Əsas axında UI-ni yeniləyin
// ...
}
});
}
}).start();
// Coroutines istifadə edərək fon axınından UI-ni yeniləmək nümunəsi
import kotlinx.coroutines.*
fun fetchDataAndUpdateUI() {
CoroutineScope(Dispatchers.IO).launch {
// Uzun əməliyyatı fon axınında yerinə yetirin
val data = fetchDataFromServer()
// UI-ni yeniləmək üçün əsas axına keçin
withContext(Dispatchers.Main) {
updateUI(data)
}
}
}