Понимание различий между синхронным и асинхронным выполнением критически важно для разработки отзывчивых Android-приложений. Рассмотрим ключевые аспекты.
Блокирующая модель
fun loadData() {
val data = networkRequest() // Блокирует текущий поток
showData(data) // Выполнится только после завершения запроса
}
Характеристики:
Где использовать:
Неблокирующая модель
fun loadData() {
viewModelScope.launch {
val data = async { networkRequest() }.await() // Не блокирует UI
showData(data)
}
}
Характеристики:
Основные подходы в Android:
Корутины (современный стандарт)
viewModelScope.launch {
val data = withContext(Dispatchers.IO) { fetchData() }
updateUI(data)
}
RxJava
disposable += Observable.fromCallable { fetchData() }
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe { updateUI(it) }
AsyncTask (устаревший)
private inner class MyTask : AsyncTask<Void, Void, String>() {
override fun doInBackground(vararg params: Void): String {
return fetchData()
}
override fun onPostExecute(result: String) {
updateUI(result)
}
}
Критерий | Синхронное | Асинхронное |
---|---|---|
Поток выполнения | Блокируется | Не блокируется |
Сложность | Проще | Сложнее |
Производительность | Ниже | Выше |
Риск ANR | Высокий | Отсутствует |
Примеры использования | Простые вычисления | Сетевые запросы, БД |
Синхронный сетевой запрос (опасно!):
// Вызовет NetworkOnMainThreadException
fun loadData() {
val response = RetrofitClient.api.getData().execute()
textView.text = response.body()?.data
}
Асинхронный запрос с Retrofit и корутинами:
fun loadData() {
viewModelScope.launch {
try {
val response = RetrofitClient.api.getData()
textView.text = response.data
} catch (e: Exception) {
showError(e)
}
}
}
Главный поток (UI Thread):
StrictMode:
Рекомендации:
Executors.newSingleThreadExecutor().execute {
// Синхронная операция в фоне
}
синхронное выполнение блокирует поток до завершения операции, тогда как асинхронное позволяет продолжить работу, обрабатывая результат позже. В Android разработке предпочтение всегда следует отдавать асинхронным подходам, особенно при работе с UI потоком, используя современные инструменты типа корутин или RxJava.