Поток (Thread) — это наименьшая единица выполнения внутри процесса, позволяющая выполнять задачи параллельно. В Android потоки играют критически важную роль для обеспечения отзывчивости UI.
Отношение к процессу
// Общая память процесса
static int sharedCounter = 0;
// Собственный стек вызовов
void threadMethod() {
int localVar = 42; // Локальная переменная потока
}
Главный поток (UI Thread)
Базовый способ (Thread class)
Thread {
// Долгая операция
val result = doNetworkCall()
// Обновление UI (НЕПРАВИЛЬНО из фонового потока)
textView.text = result // Вызовет NetworkOnMainThreadException
}.start()
Правильное обновление UI
Thread {
val result = doNetworkCall()
runOnUiThread {
textView.text = result // Корректное обновление
}
}.start()
Корутины
viewModelScope.launch {
// IO поток (автоматическое переключение)
val data = withContext(Dispatchers.IO) {
repository.fetchData()
}
// Возврат в Main поток
updateUi(data)
}
Executors и ThreadPools
val executor = Executors.newFixedThreadPool(4)
executor.execute {
// Параллельное выполнение
}
Синхронизация
@Synchronized
fun safeIncrement() {
counter++ // Потокобезопасный метод
}
Состояния гонки (Race Conditions)
Взаимоблокировки (Deadlocks)
StrictMode
ANR (Application Not Responding)
Handler/Looper
val handler = Handler(Looper.getMainLooper())
handler.post {
// Код выполнится на главном потоке
}
потоки в Android — это механизм параллельного выполнения кода, где главный поток отвечает за UI, а фоновые — за тяжелые операции. Современные приложения используют корутины или RxJava для упрощения работы с потоками, избегая блокировок UI и ANR ошибок.