Coroutine Builder — Kotlin Coroutines funksiyalarıdır ki, koryutinlər yaradır və işə salır, onların icra üsulunu müəyyən edir. launch, async, runBlocking və produce builder-ləri müxtəlif ssenariləri əhatə edir: fon tapşırıqlarından nəticə qaytaran paralel hesablamalara qədər. JetBrains, 2024 məlumatlarına görə, Coroutine Builder koryutin modelinin əsasını təşkil edir, strukturlaşdırılmış konkurrentlik və həyat dövrünün idarə edilməsini təmin edir.
Əsas məqamlar
Coroutine Builder — CoroutineScope və suspend-blok qəbul edən, yeni koryutin yaradıb işə salan Kotlin genişləndirmə funksiyasıdır. Hər bir builder koryutinin necə icra olunacağını müəyyən edir: nəticə ilə və ya nəticəsiz, thread-i bloklamaqla və ya asinxron şəkildə. Builder-lər dildə koryutin modelinə giriş nöqtələridir.
Bütün builder-lər uşaq koryutinlərin həyat dövrünü idarə edən CoroutineScope vasitəsilə işləyir. Scope ləğv edildikdə onun vasitəsilə işə salınmış bütün koryutinlər avtomatik ləğv edilir — bu strukturlaşdırılmış konkurrentlik prinsipidir. Bu yanaşma koryutin sızmalarının qarşısını alır və proqnozlaşdırıla bilən tamamlanmanı təmin edir.
import kotlinx.coroutines.*
fun main() = runBlocking {
// Builder-lər CoroutineScope daxilində işləyir
val job = launch {
delay(1000L)
println("Dünya!")
}
println("Salam,")
job.join()
}
Kotlin dörd daxili koryutin builder-i təqdim edir: launch, async, runBlocking və produce. Onların hər birinin öz qaytarılan tipi və tətbiq sahəsi var. Android mobil inkişafı üçün əsas olanlar launch və async-dir — onlar bloklamayan şəkildə işləyir və memarlıq komponentləri ilə inteqrasiya olunur.
| Builder | Qaytarılan tip | Thread bloklanması | Ssenari |
|---|---|---|---|
| launch | Job | Xeyr | Fire-and-forget tapşırıqları |
| async | Deferred<T> | Xeyr | Paralel hesablamalar |
| runBlocking | T | Bəli | Testlər, main funksiyası |
| produce | ReceiveChannel<E> | Xeyr | Axın ötürülməsi (deprecated) |
Hər bir builder əlavə parametrlər qəbul edir: CoroutineStart (işə salma strategiyası), CoroutineContext (dispetçer, istisnalar) və adlandırılmış kod bloku. Varsayılan olaraq koryutin dərhal işə salınır (CoroutineStart.DEFAULT).
launch — Android inkişafında ən çox istifadə olunan builder-dir. Nəticə qaytarmayan koryutin işə salır və onun həyat dövrünü idarə etmək üçün Job obyekti qaytarır. Bu, yalnız yan təsirin lazım olduğu əməliyyatlar üçün ideal seçimdir: DB-yə yazma, analitika göndərmə, UI yeniləmə.
launch builder-i CoroutineScope, isteğe bağlı CoroutineContext və suspend-blok qəbul edir. Qaytarılan Job koryutini ləğv etməyə, tamamlanmasını gözləməyə və ya statusu yoxlamağa imkan verir.
val scope = CoroutineScope(Dispatchers.IO + SupervisorJob())
val job: Job = scope.launch(CoroutineStart.LAZY) {
val data = fetchFromNetwork()
saveToDatabase(data)
}
job.start()
job.join()
CoroutineStart.LAZY parametri işə salmanı start() və ya join() açıq çağırışına qədər təxirə salır. Bu, gecikmiş inisializasiya və şərti işə salma üçün faydalıdır. Standart dərhal işə salma üçün CoroutineStart.DEFAULT istifadə olunur və ya parametr buraxılır.
async — Deferred<T> qaytaran builder — nəticənin asinxron vədi. await() çağırışı thread-i bloklamadan nəticə əldə olunana qədər koryutini dayandırır. Bu, Kotlin koryutinlərində paralel tapşırıqlar üçün əsas mexanizmdir.
async eyni anda bir neçə müstəqil əməliyyat yerinə yetirmək lazım olduqda xüsusilə effektivdir. Suspend-funksiyaların ardıcıl çağırışından fərqli olaraq, async koryutinləri paralel işə salır, ümumi icra müddətini qısaldır.
suspend fun fetchUserData(): UserData {
val deferred1 = CoroutineScope(Dispatchers.IO).async { api.getProfile() }
val deferred2 = CoroutineScope(Dispatchers.IO).async { api.getSettings() }
val deferred3 = CoroutineScope(Dispatchers.IO).async { api.getNotifications() }
return UserData(
profile = deferred1.await(),
settings = deferred2.await(),
notifications = deferred3.await()
)
}
Deferred Job-dan miras alır, buna görə async həyat dövrünün bütün əməliyyatlarını dəstəkləyir: ləğv etmə, tamamlanmanı gözləmə, istisnaların idarə edilməsi. Scope ləğv edildikdə Deferred uşaq koryutinləri avtomatik ləğv olunur.
runBlocking — koryutin tamamlanana qədər cari thread-i bloklayan yeganə builder-dir. Yeni CoroutineScope yaradır və ötürülən koryutini işə salır, çağıran thread-i bloklayır. main() giriş nöqtələrində, testlərdə və blocking-kodla inteqrasiyada istifadə olunur.
runBlocking üç ssenaridə əsaslandırılır: tətbiqin giriş nöqtəsi (main), suspend-funksiyaların vahid testləri və suspend istifadə edilə bilməyən callback-based kitabxanalarla inteqrasiya. Android istehsal kodunda əsas thread-də runBlocking istifadəsi qəti şəkildə tövsiyə edilmir.
class CoroutineTest {
@Test
fun `test suspend function`() = runBlocking {
val result = mySuspendFunction()
assertEquals("expected", result)
}
}
Testlər üçün runBlocking əvəzinə kotlinx-coroutines-test ilə TestCoroutineDispatcher istifadə etmək tövsiyə olunur — bu, vaxta nəzarəti təmin edir və test mühitində blokadaların qarşısını alır.
Coroutine Builder seçimi qaytarılan nəticədən və icra ssenarisindən asılıdır. Əməliyyat məlumat qaytarılmasını tələb etmirsə — launch istifadə edin. Asinxron əməliyyatın nəticəsi lazımdırsa — async. runBlocking yalnız bridging üçün tətbiq edin, produce-i isə reaktiv axınlar üçün Flow ilə əvəz edin.
Kotlin Coroutines istifadə edən Android layihələrində əsas builder cütü launch və async-dir. launch ViewModel və UseCases-də koryutinləri işə salmaq üçün, async isə şəbəkəyə və ya DB-yə paralel sorğular üçün istifadə olunur. Müasir kitabxanalar (Ktor, Room) artıq suspend-funksiyaları dəstəkləyir ki, bu da async-in birbaşa istifadəsinə ehtiyacı minimuma endirir.
Tez-tez verilən suallar
launch Job qaytarır və icra nəticəsini qaytarmır, async isə Deferred<T> — await() vasitəsilə nəticə əldə edilə bilən obyekt qaytarır. launch fire-and-forget əməliyyatları üçün, async — məlumat qaytaran tapşırıqlar üçün istifadə olunur.
Tövsiyə edilmir. runBlocking əsas thread-də ANR-yə səbəb olur və UI-ni bloklayır. Activity və Fragment daxilində lifecycleScope.launch istifadə edin — bu, blokadalar olmadan daxili həll yoludur.
launch builder-i koryutinin həyat dövrünü idarə etməyə imkan verən Job obyekti qaytarır: ləğv etmək (cancel), tamamlanmanı gözləmək (join), statusu yoxlamaq (isActive, isCompleted, isCancelled).
Deferred<T> — async builder-i tərəfindən qaytarılan nəticənin asinxron vədidir. Job-dan miras alır və nəticə əldə etmək üçün await(), bloklamayan giriş üçün getCompleted() və istisnanı yoxlamaq üçün getCompletionExceptionOrNull() metodlarını əlavə edir.
CoroutineStart.LAZY parametrindən istifadə edin: scope.launch(start = CoroutineStart.LAZY) { ... }. Sonra faktiki işə salma üçün job.start() və ya job.join() çağırın. Bu, gecikmiş inisializasiya və koryutinlərin şərti icrası üçün faydalıdır.
Xülasə
Açar təslim mobil tətbiq hazırlayacağıq
IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.
Həm də oxuyun