Sobes.tech
Middle

Kuidas teha asünkroonseid toiminguid puhtas Androidis?

sobes.tech AI

Vastus AI-lt

On olemas mitu viisi:

  1. Niidid (Threads): Oma niitide loomine ja haldamine.

    new Thread(new Runnable() {
        @Override
        public void run() {
            // Pikaajalise operatsiooni täitmine
            // ...
            // UI uuendamine (nõuab Handlerit)
            // handler.post(...)
        }
    }).start();
    
  2. Handler ja Looper: Kasutatakse sõnumite vahetamiseks niitide vahel, sageli UI uuendamiseks taustaniidist.

    Handler handler = new Handler(Looper.getMainLooper());
    // ... taustaniidil
    handler.post(new Runnable() {
        @Override
        public void run() {
            // UI uuendamine
        }
    });
    
  3. AsyncTask (vananenud, kuid kasulik teadmiseks): Lihtne viis teha asünkroonseid ülesandeid ja uuendada UI. Ei soovitata uue koodi jaoks.

    private class MyAsyncTask extends AsyncTask<Void, Void, String> {
        @Override
        protected String doInBackground(Void... voids) {
            // Pikaajalise operatsiooni täitmine
            return "Tulemus";
        }
    
        @Override
        protected void onPostExecute(String result) {
            // UI uuendamine tulemusega
        }
    }
    // ...
    // new MyAsyncTask().execute();
    
  4. ExecutorService ja Future: Paindlikum mehhanism niitide basseinide haldamiseks.

    ExecutorService executor = Executors.newSingleThreadExecutor();
    Future<String> future = executor.submit(new Callable<String>() {
        @Override
        public String call() throws Exception {
            // Pikaajalise operatsiooni täitmine
            return "Tulemus";
        }
    });
    // Tulemuse saamine (blokeeriv)
    // String result = future.get();
    
  5. Kotlin Korutinaid: Kaasaegne lähenemisviis asünkroonseks programmeerimiseks Kotlinis, mis põhineb kooperatsioonidel. Vajab sõltuvuste lisamist.

    import kotlinx.coroutines.*
    
    // ... korutina siseruumis (nt, viewModelScope)
    GlobalScope.launch(Dispatchers.IO) { // Täitmine taustal IO-voos
        // Pikaajalise operatsiooni täitmine
        withContext(Dispatchers.Main) { // Vahetus peamisele voole UI uuendamiseks
            // UI uuendamine
        }
    }
    

Valik sõltub ülesande keerukusest, nõutavast kontrollitasemest ja keelest (Java/Kotlin). Tänapäeva Androidi arenduses soovitatakse kasutada Kotlin Korutinasid või raamatukogusid nagu RxJava või Flow asünkroonseks tööks.