Sobes.tech
Middle

Ako vykonávať asynchrónne operácie v čistom Androide?

sobes.tech AI

Odpoveď od AI

Existuje niekoľko spôsobov:

  1. Vlákna (Threads): Vytváranie a správa vlastných vlákien.

    new Thread(new Runnable() {
        @Override
        public void run() {
            // Vykonanie dlhodobej operácie
            // ...
            // Aktualizácia UI (vyžaduje Handler)
            // handler.post(...)
        }
    }).start();
    
  2. Handler a Looper: Používajú sa na výmenu správ medzi vláknami, často na aktualizáciu UI z pozadia.

    Handler handler = new Handler(Looper.getMainLooper());
    // ... v pozadí
    handler.post(new Runnable() {
        @Override
        public void run() {
            // Aktualizácia UI
        }
    });
    
  3. AsyncTask (zastaralé, ale užitočné vedieť): Jednoduchý spôsob na vykonávanie asynchrónnych úloh s aktualizáciou UI. Neodporúča sa pre nový kód.

    private class MyAsyncTask extends AsyncTask<Void, Void, String> {
        @Override
        protected String doInBackground(Void... voids) {
            // Vykonanie dlhodobej operácie
            return "Výsledok";
        }
    
        @Override
        protected void onPostExecute(String result) {
            // Aktualizácia UI s výsledkom
        }
    }
    // ...
    // new MyAsyncTask().execute();
    
  4. ExecutorService a Future: Flexibilnejší mechanizmus na správu vlákien.

    ExecutorService executor = Executors.newSingleThreadExecutor();
    Future<String> future = executor.submit(new Callable<String>() {
        @Override
        public String call() throws Exception {
            // Vykonanie dlhodobej operácie
            return "Výsledok";
        }
    });
    // Získanie výsledku (blokujúce)
    // String result = future.get();
    
  5. Kotlin Korutiny: Moderný prístup k asynchrónnemu programovaniu v Kotlin, založený na kooperáciách. Vyžaduje pridanie závislostí.

    import kotlinx.coroutines.*
    
    // ... v rámci korutiny (napríklad viewModelScope)
    GlobalScope.launch(Dispatchers.IO) { // Vykonanie v pozadí IO vlákne
        // Vykonanie dlhodobej operácie
        withContext(Dispatchers.Main) { // Prepnúť na hlavný vlákno na aktualizáciu UI
            // Aktualizácia UI
        }
    }
    

Výber metódy závisí od zložitosti úlohy, požadovanej úrovne kontroly nad vláknami a preferovaného jazyka (Java/Kotlin). V súčasnej Android vývoji sa odporúča používať Kotlin Korutiny alebo knižnice na asynchrónnu prácu, ako sú RxJava alebo Flow.