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 сохта шудааст, фиристода ва коркард кунад. Одатан, Handler дар ҷараёни асосӣ барои ҳамкорӣ бо UI аз ҷараёнҳои дигар сохта мешавад.

Масъалаҳо:

  • ANR (Application Not Responding): Агар амалиёти дарозмуддат дар ҷараёни асосӣ иҷро шавад, он баста мешавад, ҳодисаҳои UI-ро кор намекунад ва экранро намоиш намедиҳад. Ин ба барнома беназоратӣ ва диалоги ANR оварда мерасонад. Вақти оддӣ, ки ANR-ро дар ҷараёни асосӣ ҳангоми кор бо UI ба вуҷуд меорад, 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)
        }
    }
}