Sobes.tech
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üvafiq Handler-lara göndərir.
  • Looper: Looper obyekti axına bağlıdır və bu mesajların işlənmə dövrünü idarə edir.
  • Handler: Handler obyekti MessageRunnable obyektlərini onun MessageQueue-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)
        }
    }
}