Jak wykonać operacje asynchroniczne w czystym Androidzie?
sobes.tech AI
Odpowiedź od AI
Istnieje kilka sposobów:
-
Wątki (Threads): Tworzenie i zarządzanie własnymi wątkami.
new Thread(new Runnable() { @Override public void run() { // Wykonywanie długotrwałej operacji // ... // Aktualizacja UI (wymaga Handler) // handler.post(...) } }).start(); -
Handler i Looper: Używane do wymiany wiadomości między wątkami, często do aktualizacji UI z wątku tła.
Handler handler = new Handler(Looper.getMainLooper()); // ... w wątku tła handler.post(new Runnable() { @Override public void run() { // Aktualizacja UI } }); -
AsyncTask (przestarzałe, ale warto znać): Prosty sposób na wykonywanie asynchronicznych zadań z aktualizacją UI. Nie zaleca się dla nowego kodu.
private class MyAsyncTask extends AsyncTask<Void, Void, String> { @Override protected String doInBackground(Void... voids) { // Wykonywanie długiej operacji return "Wynik"; } @Override protected void onPostExecute(String result) { // Aktualizacja UI z wynikiem } } // ... // new MyAsyncTask().execute(); -
ExecutorService i Future: Bardziej elastyczny mechanizm zarządzania pulami wątków.
ExecutorService executor = Executors.newSingleThreadExecutor(); Future<String> future = executor.submit(new Callable<String>() { @Override public String call() throws Exception { // Wykonywanie długiej operacji return "Wynik"; } }); // Pobranie wyniku (blokujące) // String result = future.get(); -
Kotlin Coroutines: Nowoczesne podejście do programowania asynchronicznego w Kotlinie, oparte na korutynach. Wymaga dodania zależności.
import kotlinx.coroutines.* // ... w zakresie korutyny (np. viewModelScope) GlobalScope.launch(Dispatchers.IO) { // Wykonywanie w tle na wątku IO // Wykonywanie długiej operacji withContext(Dispatchers.Main) { // Przełączenie na główny wątek do aktualizacji UI // Aktualizacja UI } }
Wybór metody zależy od złożoności zadania, wymaganego poziomu kontroli nad wątkami i preferencji języka (Java/Kotlin). W nowoczesnym rozwoju Androida zaleca się używanie Kotlin Coroutines lub bibliotek takich jak RxJava czy Flow.