Можно использовать несколько способов:
Thread: Создание нового потока для выполнения задачи. Простой, но управление жизненным циклом и передача данных обратно в главный поток требуют дополнительной логики (Handler, runOnUiThread).
java
AsyncTask: Устаревший, но простой класс для выполнения фоновых операций и обновления UI. Предоставляет методы onPreExecute, doInBackground, onProgressUpdate, onPostExecute.
java
Handler и Looper: Более гибкий механизм для отправки и обработки сообщений и задач между потоками. Handler связан с Looper потока, в котором он создан.
java
ExecutorService и Callable/Runnable: Стандартные Java-механизмы для управления пулом потоков. Позволяют более эффективно использовать ресурсы и управлять выполнением множества задач.
java
Coroutine (с Kotlin): Более современный и удобный способ управления асинхронными операциями в Kotlin. Позволяют писать асинхронный код в императивном стиле. Требуется добавление соответствующих зависимостей.
kotlin