Jak provádět asynchronní operace v čistém Androidu?
sobes.tech AI
Odpověď od AI
Existuje několik způsobů:
-
Vlákna (Threads): Vytváření a správa vlastních vláken.
new Thread(new Runnable() { @Override public void run() { // Provádění dlouhotrvající operace // ... // Aktualizace UI (vyžaduje Handler) // handler.post(...) } }).start(); -
Handler a Looper: Používají se k výměně zpráv mezi vlákny, často k aktualizaci UI z pozadí.
Handler handler = new Handler(Looper.getMainLooper()); // ... v pozadí vlákna handler.post(new Runnable() { @Override public void run() { // Aktualizace UI } }); -
AsyncTask (zastaralé, ale užitečné vědět): Jednoduchý způsob, jak provádět asynchronní úkoly s aktualizací UI. Nedoporučuje se pro nový kód.
private class MyAsyncTask extends AsyncTask<Void, Void, String> { @Override protected String doInBackground(Void... voids) { // Provádění dlouhotrvající operace return "Výsledek"; } @Override protected void onPostExecute(String result) { // Aktualizace UI s výsledkem } } // ... // new MyAsyncTask().execute(); -
ExecutorService a Future: Flexibilnější mechanismus pro správu vláken.
ExecutorService executor = Executors.newSingleThreadExecutor(); Future<String> future = executor.submit(new Callable<String>() { @Override public String call() throws Exception { // Provádění dlouhotrvající operace return "Výsledek"; } }); // Získání výsledku (blokující) // String result = future.get(); -
Kotlin Coroutines: Moderní přístup k asynchronnímu programování v Kotlinu, založený na korutinách. Vyžaduje přidání závislostí.
import kotlinx.coroutines.* // ... v scope korutiny (například viewModelScope) GlobalScope.launch(Dispatchers.IO) { // Vykonání na pozadí v IO vlákně // Provádění dlouhotrvající operace withContext(Dispatchers.Main) { // Přepnutí na hlavní vlákno pro aktualizaci UI // Aktualizace UI } }
Volba metody závisí na složitosti úkolu, požadované úrovni kontroly nad vlákny a preferencích jazyka (Java/Kotlin). V moderním vývoji Android se doporučuje používat Kotlin Coroutines nebo knihovny jako RxJava nebo Flow.