Sobes.tech
Junior

Kako radi glavni tok u Androidu?

sobes.tech АИ

Одговор од АИ

Главни поток (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)
        }
    }
}