Как сделать чтобы операции не влияли на UI

«Как сделать чтобы операции не влияли на UI» — вопрос из категории Многопоточность, который задают на 23% собеседований Android Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Для выполнения операций без блокировки UI используйте корутины или AsyncTask (устарел).

Корутины (рекомендуется):

lifecycleScope.launch(Dispatchers.IO) {  
    // Тяжелая операция (сеть, БД и т.д.)  
    val result = doBackgroundWork()  
    withContext(Dispatchers.Main) {  
        // Обновление UI после завершения  
        updateUI(result)  
    }  
}  

RxJava:

Observable.fromCallable { doBackgroundWork() }  
    .subscribeOn(Schedulers.io())  
    .observeOn(AndroidSchedulers.mainThread())  
    .subscribe { result -> updateUI(result) }  

Thread + Handler (если без сторонних решений):

Thread {  
    val result = doBackgroundWork()  
    Handler(Looper.getMainLooper()).post {  
        updateUI(result)  
    }  
}.start()  

Важно:

  • Не выполняйте долгие операции в onCreate(), onClick() и т.д.
  • Для работы с жизненным циклом (Activity/Fragment) используйте lifecycleScope или viewModelScope.