В Android разработке существует несколько подходов к реализации многопоточности, каждый со своими особенностями и сферами применения. Рассмотрим основные варианты от классических до современных.
Thread {
// Фоновая операция
val result = doHeavyWork()
runOnUiThread {
// Обновление UI
updateViews(result)
}
}.start()
Плюсы:
Минусы:
private inner class MyTask : AsyncTask<URL, Int, Bitmap>() {
override fun doInBackground(vararg urls: URL): Bitmap {
// В фоновом потоке
return loadImage(urls[0])
}
override fun onPostExecute(result: Bitmap) {
// В UI потоке
imageView.setImageBitmap(result)
}
}
Плюсы:
Минусы:
val handlerThread = HandlerThread("MyHandlerThread")
handlerThread.start()
val handler = Handler(handlerThread.looper)
handler.post {
// Выполнится в фоновом потоке
val result = fetchData()
Handler(Looper.getMainLooper()).post {
// Вернуться в главный поток
showData(result)
}
}
Плюсы:
Минусы:
val executor = Executors.newFixedThreadPool(4)
val future = executor.submit {
doBackgroundWork()
}
// Для UI обновлений
Handler(Looper.getMainLooper()).post {
updateUI(future.get())
}
Плюсы:
Минусы:
Observable.fromCallable { fetchData() }
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(
{ data -> showData(data) },
{ error -> showError(error) }
)
Плюсы:
Минусы:
viewModelScope.launch {
// UI поток
showLoading()
val result = withContext(Dispatchers.IO) {
// Фоновая операция
repository.fetchData()
}
// Снова UI поток
showData(result)
}
Плюсы:
Минусы:
val workRequest = OneTimeWorkRequestBuilder<MyWorker>()
.setConstraints(
Constraints.Builder()
.setRequiredNetworkType(NetworkType.CONNECTED)
.build()
)
.build()
WorkManager.getInstance(context).enqueue(workRequest)
Плюсы:
Минусы:
Метод | Сложность | Управление жизненным циклом | Поддержка отмены | Совместимость с UI |
---|---|---|---|---|
Thread | Низкая | Плохая | Нет | Ручная |
AsyncTask | Низкая | Средняя | Да | Автоматическая |
Handler/Looper | Средняя | Средняя | Частичная | Ручная |
Executors | Средняя | Средняя | Через Future | Ручная |
RxJava | Высокая | Хорошая | Да | Автоматическая |
Корутины | Средняя | Отличная | Да | Автоматическая |
WorkManager | Средняя | Отличная | Да | Нет |
Dispatchers.IO
Executors
или корутины с async/await
современная Android разработка преимущественно использует корутины как основной инструмент многопоточности, дополняя их RxJava для сложных потоков данных и WorkManager для фоновых задач. Выбор конкретного подхода зависит от сложности задачи, требований к производительности и необходимости интеграции с UI.