lifecycleScope — androidx.lifecycle kutubxonasidan o'rnatilgan CoroutineScope bo'lib, Activity, Fragment yoki har qanday LifecycleOwner ning hayot aylanishiga bog'langan va komponent yo'q qilinganda korutinlarni avtomatik bekor qiladi. Google Android Developers, 2025 ma'lumotlariga ko'ra, lifecycleScope UI qatlami bilan bog'liq korutinlarni Activity yoki Fragment yo'q qilingandan keyin kodni bajarish xavfisiz xavfsiz ishga tushirishga imkon beradi. Scope LifecycleOwner DESTROYED holatiga o'tganda avtomatik bekor qilinadi.
Asosiy ma'lumotlar
lifecycleScope — LifecycleOwner (Activity, Fragment, Service) interfeysidagi kengaytma xususiyati bo'lib, komponentning to'liq hayot aylanishiga bog'langan tayyor CoroutineScope ni ta'minlaydi. LifecycleOwner DESTROYED holatiga yetganda, lifecycleScope barcha faol korutinlarni avtomatik bekor qiladi.
// Fragment yoki Activity da
lifecycleScope.launch {
delay(1000)
showSnackbar("Salom!")
}
viewModelScope dan farqli o'laroq, lifecycleScope har bir LifecycleOwner yo'q qilinganda — ekran rotatsiyasini ham o'z ichiga olgan holda — bekor qilinadi. Bu uni faqat ma'lum bir ekran ko'rinadigan bo'lganda yashashi kerak bo'lgan operatsiyalar uchun ideal qiladi.
lifecycleScope LifecycleOwner mavjud bo'lgan har qanday joyda mavjud:
Avtomatik bekor qilish mexanizmi Lifecycle hodisalariga obuna bo'lishga asoslangan. Lifecycle CREATED dan DESTROYED ga tushganda, scope bekor qilinadi.
| Holat | Tavsif | Scope aktiv |
|---|---|---|
| CREATED | LifecycleOwner yaratilgan, onCreate bajarilgan | Ha |
| STARTED | LifecycleOwner ko'rinadi (onStart) | Ha |
| RESUMED | LifecycleOwner oldingi planda (onResume) | Ha |
| DESTROYED | LifecycleOwner yo'q qilingan (onDestroy) | Yo'q (scope bekor qilingan) |
lifecycleScope CoroutineScope(SupervisorJob() + Dispatchers.Main.immediate) sifatida yaratiladi va Lifecycle ichida saqlanadi. Lifecycle DESTROYED holatiga o'tganda scope.cancel() chaqiriladi. Mexanizm scope ga birinchi murojaatda hayot aylanishi hodisalariga obuna bo'ladigan LifecycleEventObserver orqali amalga oshiriladi.
Ekran aylantirilganda, Activity yo'q qilinadi (onDestroy) va qayta yaratiladi. lifecycleScope eski Activity bilan birga bekor qilinadi va yangi Activity uchun yangi scope namunasi yaratiladi. Bu rotatsiyada saqlanib qoladigan viewModelScope dan printsipial farqdir.
Lifecycle kutubxonasi lifecycleScope orqali korutinlarni ishga tushirishning bir necha usullarini ta'minlaydi. Eskirgan metodlardan zamonaviy metodlargacha API evolyutsiyasini ko'rib chiqaylik.
Eng oddiy usul — lifecycleScope.launch { ... }. Korutin darhol ishga tushadi va DESTROYED da bekor qilinadi. Biroq, UI ko'rinmasa ham kodni bajarishi mumkin (masalan, onStop dan keyin fonda). Bu har doim ham istalmagan.
Bu metodlar Lifecycle belgilangan holatdan pastga tushganda korutin bajarilishini to'xtatar va qaytganda davom ettirardi. Biroq ular lifecycle-runtime-ktx 2.6.0 da @Deprecated deb belgilandi, chunki:
repeatOnLifecycle — Google tomonidan tavsiya etilgan, hayot aylanishi bilan sinxronlashtirilgan korutinlarni ishga tushirish usulidir. Lifecycle belgilangan holatga yetganda korutinni bekor qiladi va qayta ishga tushiradi.
lifecycleScope.launch {
repeatOnLifecycle(Lifecycle.State.STARTED) {
viewModel.uiState.collect { state ->
updateUI(state)
}
}
}
repeatOnLifecycle ga uzatilgan korutin Lifecycle STARTED ga yetganda ishga tushadi va STARTED dan pastga tushganda bekor qilinadi. STARTED ga qaytganda korutin qaytadan boshlanadi. Bu xavfsiz va samarali — hech bir korutin pauzada osilib qolmaydi.
Flow dan hayot aylanishini hisobga olgan holda ma'lumot yig'ish uchun flowWithLifecycle operatori mavjud. Lifecycle holati o'zgarganda yig'ishni avtomatik to'xtatadi va davom ettiradi:
viewModel.uiState
.flowWithLifecycle(lifecycle, Lifecycle.State.STARTED)
.onEach { state -> updateUI(state) }
.launchIn(lifecycleScope)
flowWithLifecycle operatori — UI qatlamida Flow ga xavfsiz obuna bo'lishning eng qisqa usulidir.
Kotlin da Android ilovasida lifecycleScope dan foydalanishning uchta real stsenariysini ko'rib chiqaylik.
class MapFragment : Fragment() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
lifecycleScope.launch {
repeatOnLifecycle(Lifecycle.State.STARTED) {
locationProvider.observeLocation().collect { loc ->
updateMapMarker(loc)
}
}
}
}
}
Korutin fragment ko'rinadigan bo'lganda (STARTED) boshlanadi va ekranni tark etganda (STOPPED) bekor qilinadi. Agar foydalanuvchi boshqa ilovaga o'tsa, joylashuv yangilanishlari batareyani sarf qilmaydi.
lifecycleScope.launch {
repeatOnLifecycle(Lifecycle.State.RESUMED) {
animateFadeIn(titleView)
delay(200)
animateSlideUp(contentView)
}
}
Animatsiya faqat fragment oldingi planda bo'lganda (RESUMED) ishga tushadi. Agar foydalanuvchi animatsiya paytida ilovani yig'ishtirsa, korutin bekor qilinadi va qaytganda animatsiya qaytadan boshlanadi.
lifecycleScope.launch {
repeatOnLifecycle(Lifecycle.State.STARTED) {
while (isActive) {
syncData()
delay(30_000L)
}
}
}
Ma'lumotlar har 30 soniyada sinxronlashtiriladi, lekin faqat ekran ko'rinadigan bo'lganda. isActive korutin bekor qilinmaganligini tekshiradi, bu ekranni tark etishda sikl'dan xavfsiz chiqishni ta'minlaydi.
Ikkala scope ham hayot aylanishiga bog'langan, lekin uning turli jihatlariga. Farqni tushunish Android ilovalarining to'g'ri arxitekturasi uchun muhim ahamiyatga ega.
viewModelScope ekran rotatsiyasidan omon qoladigan ViewModel ga bog'langan. lifecycleScope rotatsiyada yo'q qilinadigan va qayta yaratiladigan LifecycleOwner (Activity/Fragment) ga bog'langan. Bu ularning qo'llanish stsenariylarini belgilaydi.
Amalda ikkala scope ning kombinatsiyasi tez-tez uchraydi: viewModelScope ma'lumot yuklaydi va holatni boshqaradi, lifecycleScope ViewModel dan Flow ga ekranning hayot aylanishini hisobga olgan holda obuna bo'ladi. Bu mas'uliyat taqsimoti zamonaviy Android rivojlanishida best practice hisoblanadi.
Dasturchilar lifecycleScope dan foydalanishda yo'l qo'yadigan to'rtta eng keng tarqalgan xatoni ko'rib chiqaylik.
Ma'lumot yuklashni lifecycleScope.launch da boshlasangiz, ekran rotatsiyasida korutin bekor qilinadi va ma'lumotni qayta yuklash kerak bo'ladi. Uzoq muddatli operatsiyalar uchun viewModelScope dan foydalaning. lifecycleScope — faqat UI bilan bog'liq vazifalar uchun.
lifecycleScope.launch ichida to'g'ridan-to'g'ri viewModel.someFlow.collect { ... } chaqiruvi ekran ko'rinmasa ham ma'lumot yig'ishni davom ettiradi. Bu fonda UI yangilanishlari va keraksiz yukga olib kelishi mumkin. Har doim repeatOnLifecycle yoki flowWithLifecycle dan foydalaning.
lifecycleScope DESTROYED da bekor qilinsa ham, to'xtatish nuqtasidan (suspend) keyingi kod to'satdan bekor qilishda bajarilmasligi mumkin. NonCancellable dan foydalanmasangiz, suspend chaqiruvidan keyingi kod bajarilishiga ishonmang.
launchWhenStarted va uning analoglari korutinni bekor qilmaydi, faqat to'xtatadi. Ekran bir necha marta oldingi va fon plan o'rtasida almashsa, korutin kechiktirilgan chaqiruvlarni to'playdi. repeatOnLifecycle ga o'ting — bu Lifecycle bilan sinxronizatsiyaning yagona to'g'ri usulidir.
Tez-tez beriladigan savollar
lifecycleScope LifecycleOwner yo'q qilinganda avtomatik bekor qilinadi. GlobalScope ilovaning butun ishlash vaqti davomida yashaydi. lifecycleScope dagi korutin komponent yo'q qilingandan keyin UI ni yangilay olmaydi, GlobalScope da esa yangilashi mumkin, bu esa xatolarga olib keladi. Har doim UI qatlamida lifecycleScope dan foydalaning.
Yo'q, ViewModel LifecycleOwner emas, shuning uchun lifecycleScope unda mavjud emas. ViewModel viewModelScope dan foydalanadi. Agar kod ikkala kontekstda bajarilishi kerak bo'lsa — mantiqni use case yoki repozitoryga suspend funksiyalari bilan chiqaring.
Har bir repeatOnLifecycle chaqiruvi Lifecycle ning belgilangan holatiga yetganda blokni ishga tushiradigan yangi korutin yaratadi. Agar repeatOnLifecycle bir xil holat uchun ikki marta chaqirilsa, ikkala blok mustaqil ravishda ishga tushadi. Odatda onViewCreated da bir marta chaqirish kifoya.
To'g'ridan-to'g'ri lifecycleScope dispetcherini o'zgartirib bo'lmaydi — u Dispatchers.Main.immediate dan foydalanadi. Korutin bloki ichida withContext orqali boshqa dispetcherga o'tishingiz mumkin. Testlar uchun LifecycleOwner bilan TestDispatcher dan foydalaning.
lifecycleScope LifecycleOwner DESTROYED holatiga o'tganda (onDestroy dan keyin) bekor qilinadi. Oddiy lifecycleScope.launch chaqiruvlari onPause yoki onStop da bekor qilinmaydi. Fonga o'tishda to'xtatish uchun repeatOnLifecycle(STARTED) yoki repeatOnLifecycle(RESUMED) dan foydalaning.
Xulosa
Biz kalit topshirig'i bilan mobil ilovani ishlab chiqamiz
IT Sectr 2017-yildan beri startaplar va korxonalar uchun iOS va Android ilovalarini yaratadi. Biz sizga maslahat beramiz va eng yaxshi yechimni taklif qilamiz.