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:
-
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.
-
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.
-
HandlervəLooper: 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.
-
ExecutorService/ThreadPoolExecutor: Axın havzalarını təmin edir, bu da hər tapşırıq üçün yeniThreadyaratmaqdan 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:
-
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.
-
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ı:
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ə.Ü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.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)
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.