Sobes.tech
Middle

Kā veikt asīnhronas operācijas tīrā Android?

sobes.tech AI

Atbilde no AI

Ir daudz veidu:

  1. Vijas (Threads): Izveidot un pārvaldīt savas vijas.

    new Thread(new Runnable() {
        @Override
        public void run() {
            // Ilgas operācijas izpilde
            // ...
            // UI atjaunināšana (prasība pēc Handler)
            // handler.post(...)
        }
    }).start();
    
  2. Handler un Looper: Tiek izmantoti ziņojumu apmaiņai starp vijas, bieži UI atjaunināšanai no fonu vijas.

    Handler handler = new Handler(Looper.getMainLooper());
    // ... fonā
    handler.post(new Runnable() {
        @Override
        public void run() {
            // UI atjaunināšana
        }
    });
    
  3. AsyncTask (novecojis, bet noderīgs zināšanai): Vienkāršs veids, kā veikt asinhronas uzdevumus ar UI atjaunināšanu. Nav ieteicams jaunam kodam.

    private class MyAsyncTask extends AsyncTask<Void, Void, String> {
        @Override
        protected String doInBackground(Void... voids) {
            // Ilgas operācijas izpilde
            return "Rezultāts";
        }
    
        @Override
        protected void onPostExecute(String result) {
            // UI atjaunināšana ar rezultātu
        }
    }
    // ...
    // new MyAsyncTask().execute();
    
  4. ExecutorService un Future: Elastīgāks mehānisms viju baseinu pārvaldībai.

    ExecutorService executor = Executors.newSingleThreadExecutor();
    Future<String> future = executor.submit(new Callable<String>() {
        @Override
        public String call() throws Exception {
            // Ilgas operācijas izpilde
            return "Rezultāts";
        }
    });
    // Rezultāta iegūšana (bloķējoša)
    // String result = future.get();
    
  5. Kotlin Korutinas: Mūsdienīgs pieejas veids asinhronai programmēšanai Kotlin, balstīts uz kooperācijām. Prasa pievienot atkarības.

    import kotlinx.coroutines.*
    
    // ... korutinu sfera (piem., viewModelScope)
    GlobalScope.launch(Dispatchers.IO) { // Darbība fonā IO plūsmā
        // Ilgas operācijas izpilde
        withContext(Dispatchers.Main) { // Pārslēgties uz galveno plūsmu UI atjaunināšanai
            // UI atjaunināšana
        }
    }
    

Izvēle ir atkarīga no uzdevuma sarežģītības, nepieciešamā kontroles līmeņa un valodas (Java/Kotlin). Mūsdienu Android izstrādē ieteicams izmantot Kotlin Korutinas vai bibliotēkas asinhronai darbībai, piemēram, RxJava vai Flow.