Как выполнять асинхронные операции в Android?

В Android асинхронные операции — это операции, которые выполняются вне главного (UI) потока, чтобы не блокировать пользовательский интерфейс. Они особенно важны для:

  • сетевых запросов,

  • чтения/записи в базу данных,

  • работы с файлами,

  • длительных вычислений и загрузок.

🔹 Основные способы выполнения асинхронных операций в Android

1. Корутины (kotlinx.coroutines) — современный стандарт

Самый популярный способ в современной Android-разработке.

viewModelScope.launch {
val result = withContext(Dispatchers.IO) {
fetchDataFromNetwork()
}
textView.text = result
}
  • viewModelScope — привязывает корутину к жизненному циклу ViewModel.

  • Dispatchers.IO — переносит задачу во фоновый поток.

  • withContext — переключает контекст выполнения.

Используется вместе с suspend-функциями.

2. LiveData и ViewModel + корутины

class MyViewModel : ViewModel() {
val data = MutableLiveData<String>()
fun loadData() {
viewModelScope.launch {
val result = repository.getData() // suspend-функция
data.postValue(result)
}
}
}

→ UI подписывается на LiveData и обновляется, когда данные приходят.

3. RxJava (реактивный подход)

compositeDisposable.add(
apiService.getUser()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe { user -> showUser(user) }
)
  • Schedulers.io() — фоновый поток.

  • AndroidSchedulers.mainThread() — UI-поток.

Хотя RxJava мощный, он постепенно уступает корутинам.

4. WorkManager (для фоновых задач с условиями)

Работает даже если приложение закрыто или перезагружено.

val request = OneTimeWorkRequestBuilder<MyWorker>().build()
WorkManager.getInstance(context).enqueue(request)

Подходит для фоновых задач с условиями (например, «только при Wi-Fi»).

5. Handler и HandlerThread (устаревший способ)

val handlerThread = HandlerThread("MyThread").apply { start() }
val handler = Handler(handlerThread.looper)
handler.post {
// фоновая операция
val result = doHeavyWork()
runOnUiThread {
textView.text = result
}
}

Используется всё реже — корутины и WorkManager лучше.

6. AsyncTask (устарел, удалён с API 30)

Раньше был популярен, но не рекомендуется к использованию. Был удалён из Android SDK.

🔧 Примеры практического применения

Сетевой запрос с Retrofit и корутинами

interface ApiService {
@GET("user")
suspend fun getUser(): User
}
viewModelScope.launch {
val user = apiService.getUser()
userLiveData.value = user
}

Чтение из Room (БД) в корутине

@Dao
interface UserDao {
@Query("SELECT \* FROM users")
suspend fun getAll(): List<User>
}
viewModelScope.launch {
val users = userDao.getAll()
\_usersLiveData.value = users
}

✅ Что выбрать в 2025 году

Подход Когда использовать
Корутины ✅ Почти всегда — простой и гибкий подход
--- ---
LiveData + ViewModel ✅ Для привязки к UI и жизненному циклу
--- ---
RxJava 🔸 Если уже используется в проекте
--- ---
WorkManager ✅ Для фоновых задач, работающих независимо
--- ---
Handler 🔸 Для специфических низкоуровневых задач
--- ---

Итого

Асинхронные операции в Android обеспечивают гибкость, отзывчивость интерфейса и стабильность приложения. Наиболее удобный и читаемый современный способ — корутины в сочетании с ViewModel и Dispatchers, особенно в архитектуре MVVM. Другие инструменты (RxJava, WorkManager) применяются в зависимости от задачи.