Sobes.tech
Junior

Kodun paralel (əsas olmayan) iş parçacığında necə icra edilər?

sobes.tech Süni İntellekt

AI-dan cavab

Androidda kodun paralel icra olunması üçün müxtəlif mexanizmlər istifadə olunur ki, bu da əsas (UI) axını bloklamadan və tətbiqin cavab vermə qabiliyyətini qoruyur.

Android-in standart vasitələri:

  1. Thread: Yeni axın yaratmaq üçün əsas sinif.

    new Thread(new Runnable() {
        @Override
        public void run() {
            // Paralel axında icra olunacaq kod
        }
    }).start();
    

    Mənfi cəhət: Əl ilə axınların idarə olunması həyat dövrü problemlərinə və yaddaş sızmalarına səbəb ola bilər.

  2. AsyncTask (Köhnə): Paralel axınlarla işləməni və UI axını ilə qarşılıqlı əlaqəni sadələşdirir.

    private static class MyAsyncTask extends AsyncTask<Void, Void, Void> {
        @Override
        protected Void doInBackground(Void... params) {
            // Fon axınında icra olunacaq kod
            return null;
        }
    
        @Override
        protected void onPostExecute(Void result) {
            // doInBackground tamamlandıqdan sonra UI ilə işləmək
        }
    }
    // İstifadə: new MyAsyncTask().execute();
    

    Mənfi cəhətlər: Köhnəlib, məhdudiyyətləri və həyat dövrü idarəetməsində çətinlikləri var.

  3. HandlerLooper: Mesajların işlənməsi dövrləri ilə axınlar yaratmağa imkan verir.

    HandlerThread handlerThread = new HandlerThread("MyWorkerThread");
    handlerThread.start();
    Handler handler = new Handler(handlerThread.getLooper());
    handler.post(new Runnable() {
        @Override
        public void run() {
            // Looper ilə axında icra olunacaq kod
        }
    });
    

    Üstünlük: Təkrarlanan tapşırıqları yerinə yetirmək və ya asinxron hadisələri işləmək üçün əlverişlidir.

  4. ExecutorService / ThreadPoolExecutor: Axın havzalarını təmin edir, bu da hər tapşırıq üçün yeni Thread yaratmaqdan daha effektivdir.

    ExecutorService executor = Executors.newSingleThreadExecutor(); // Yaxud newCachedThreadPool(), newFixedThreadPool(N)
    executor.execute(new Runnable() {
        @Override
        public void run() {
            // Havza axınında icra olunacaq kod
        }
    });
    // Bitirdikdən sonra executor.shutdown() çağırmaq lazımdır
    

    Üstünlüklər: Axınların yaradılmasını və yenidən istifadəsini idarə edir, xərcləri azaldır.

Müasir yanaşmalar:

  1. Kotlin Coroutines: Yüngül axınlar, asinxron proqramlaşdırma üçün daha sadə və oxunaqlı üsul təqdim edir.

    import kotlinx.coroutines.*
    
    // Axın havzasında korutina işə salınması (fon axını kimi)
    GlobalScope.launch(Dispatchers.Default) {
        // Fon axınında icra olunacaq kod
    }
    
    // IO əməliyyatları üçün korutina işə salınması
    GlobalScope.launch(Dispatchers.IO) {
        // Şəbəkə, fayllar və s. ilə işləmə
    }
    
    // İstifadəçi interfeysini yeniləmək üçün UI axınına keçid
    GlobalScope.launch(Dispatchers.Default) {
        // Fon hesablamaları
        withContext(Dispatchers.Main) {
            // UI yeniləməsi
        }
    }
    

    Üstünlüklər: Kodun oxunması yaxşılaşır, resurslardan daha səmərəli istifadə, tapşırıqları ləğv etməyi asan idarə etmək, strukturlaşdırılmış konkurrentlik.

  2. RxJava / RxKotlin: Reaktiv proqramlaşdırma, müşahidə olunan məlumat axınlarına əsaslanır.

    import io.reactivex.rxjava3.core.Observable;
    import io.reactivex.rxjava3.schedulers.Schedulers;
    
    Observable.just("Nəticə")
        .subscribeOn(Schedulers.io()) // IO axınında yerinə yetirmək
        .observeOn(AndroidSchedulers.mainThread()) // UI axınında müşahidə etmək
        .subscribe(/* Nəticənin işlənməsi */);
    

    Üstünlüklər: Asinxron hadisələrlə işləmək və məlumatların çevrilməsi üçün güclü vasitə, lakin daha yüksək giriş səviyyəsi tələb edir.

WorkManager kitabxanası:

  1. WorkManager: Background tapşırıqların təminatlı yerinə yetirilməsi üçün Architecture Components tövsiyə olunan komponenti, tətbiq bağlanmış və ya cihaz yenidən başlamış olsa belə.
    import androidx.work.*
    import java.util.concurrent.TimeUnit
    
    class MyWorker: Worker(appContext, workerParams) {
        override fun doWork(): Result {
            // Background tapşırıq yerinə yetirmə kodu
            return Result.success() // və ya Result.failure(), Result.retry()
        }
    }
    
    // Tapşırıq üçün sorğu yaradılması
    val workRequest = OneTimeWorkRequestBuilder<MyWorker>()
        .setConstraints(Constraints.Builder().setRequiredNetworkType(NetworkType.CONNECTED).build()) // İxtiyari məhdudiyyətlər
        .build()
    
    // Tapşırığı növbəyə qoymaq
    WorkManager.getInstance(context).enqueue(workRequest)
    
    Üstünlüklər: Garantili yerinə yetirmə, məhdudiyyətlərin dəstəklənməsi (şəbəkə növü, batareya), ləğv etmə idarəetməsi, gecikdirilmiş yerinə yetirmə və təkrarlamalar.

Xüsusi metodun seçimi tapşırığın növü, həyat dövrü və etibarlılıq tələblərinə bağlıdır. Müasir Android tətbiqlərinin əksəriyyətində Kotlin Coroutines və ya WorkManager istifadə etmək tövsiyə olunur.