Mobil ishlanmada Lazy Loading — qanday ishlaydi, prinsiplari va tatbiqi

Muallif: IT Sectr Nashr etilgan: 2026-04-01 O'qish vaqti: 9 daq

Lazy Loading — ma'lumotlar, tasvirlar va komponentlarni kechiktirib yuklash strategiyasi bo'lib, unda resurslar ilova ishga tushganda emas, balki foydalanuvchiga ular haqiqatan kerak bo'lgan paytda so'raladi. Android Paging 3 Guide ma'lumotlariga ko'ra, ro'yxatlarning dangasa yuklanishi katta ma'lumotlar to'plamlari bilan ishlashda xotira sarfini 60–80% ga kamaytiradi. Kechiktirilgan ishga tushirish — barcha Lazy Loading tatbiqlari asosidagi asosiy prinsip.

Asosiy ma'lumotlar

  • Lazy Loading — xotirani tejaydigan va birinchi ishga tushirishni tezlashtiradigan kechiktirilgan yuklash namunasi
  • LazyVStack va LazyHStack — dangasa ro'yxatlar uchun SwiftUI ning o'rnatilgan komponentlari
  • Paging 3 — API va ma'lumotlar bazasidan sahifalab ma'lumot yuklash uchun Android kutubxonasi
  • Tasvir kutubxonalari (Glide, Coil, Kingfisher) rasmlarni faqat ekranda paydo bo'lganda yuklaydi
  • Preloading — silliq UX uchun Lazy Loading ning teskari tomoni bo'lgan oldindan yuklash

Lazy Loading nima

Lazy Loading (dangasa yuklash, kechiktirilgan yuklash) — ilova resurslari ishga tushganda emas, balki foydalanishdan oldin to'g'ridan-to'g'ri yuklanadigan dizayn va optimallashtirish namunasidir. Mobil ishlanmada Lazy Loading uch asosiy kategoriyaga qo'llaniladi: ma'lumotlar (ro'yxatlarni sahifalash), tasvirlar (aylantirishda yuklash) va komponentlar (dangasa stek va ko'rinishlar).

Lazy Loading ning aksi Eager Loading (ochko'z yuklash) deb ataladi, bunda barcha resurslar ekran ishga tushganda yuklanadi. Eager Loading tatbiq qilish osonroq, lekin ko'proq xotira sarflaydi va birinchi ko'rsatish vaqtini oshiradi. Minglab elementli ro'yxatlar uchun Eager Loading cheklangan xotirali qurilmalarda OOM (Out of Memory) ga olib keladi. Lazy Loading bu muammoni hal qiladi, faqat ekranda ko'rinadigan narsalarni yuklaydi va qolganini aylantirish paytida qo'shadi.

iOS va Android kontekstida Lazy Loading turli darajalarda tatbiq qilingan. SwiftUI dangasa renderlash uchun LazyVStack va LazyHStack ni taqdim etadi. UIKit dequeueReusableCell bilan UITableView dan foydalanadi. Android — ViewHolder hovuzi bilan RecyclerView. Ma'lumotlar darajasida — Paging 3 bilan Room va NSFetchedResultsController bilan Core Data. Muayyan texnologiyani tanlash stack va ishlash talablariga bog'liq.

Dangasa yuklashning ishlash prinsiplari

Markaziy prinsip Lazy Loading — ekranning joriy holati uchun zarur bo'lgan aniq ma'lumot hajmini va silliq aylantirish uchun oldindan yuklash buferini yuklash. Bu yondashuv ikki mexanizmga asoslanadi: ko'rinishni kuzatish va elementlarni virtualizatsiya qilish.

Ko'rinishni kuzatish

Kuzatish mexanizmi ekranning ko'rinadigan sohasida (viewport) qaysi elementlar joylashganligini aniqlaydi. Android da buni LinearLayoutManager yoki GridLayoutManager findFirstVisibleItemPosition va findLastVisibleItemPosition metodlari orqali amalga oshiradi. iOS da UIScrollView ko'rinadigan sohani hisoblash uchun bounds.origin.y va contentOffset.height ni taqdim etadi. Element viewport (yoki prefetch buferi) ga kirganda uning yuklanishi boshlanadi. Element ekranni tark etganda uning resurslari bo'shatilishi yoki keshga ko'chirilishi mumkin.

kotlin
// Android — RecyclerView da ko'rinishni kuzatish
recyclerView.addOnScrollListener(object : RecyclerView.OnScrollListener() {
    override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
        val layoutManager = recyclerView.layoutManager as LinearLayoutManager
        val lastVisible = layoutManager.findLastVisibleItemPosition()
        val totalCount = layoutManager.itemCount
        // Agar 5 elementdan kam qolgan bo'lsa, keyingi sahifani yuklaymiz < 5 ta element
        if (lastVisible >= totalCount - 5) {
            loadMoreItems()
        }
    }
})

Buferlash va prefetch

Prefetch buferi — yaqinda ekranda paydo bo'ladigan elementlarni oldindan yuklash. RecyclerView layoutManager.setItemPrefetchEnabled(true) orqali GapWorker.Prefetch ni qo'llab-quvvatlaydi. iOS UITableView UITableViewDataSourcePrefetching orqali prefetching ni qo'llab-quvvatlaydi. Prefetch buferining hajmi odatda 1–2 ekran oldinga bo'lib, aylantirish silliqligi va xotira sarfi o'rtasida murosani ta'minlaydi. Juda katta prefetch buferi Lazy Loading afzalliklarini yo'qotadi, juda kichik — tez aylantirishda bo'sh joylar yaratadi.

Tasvirlarning Lazy Loading i

Tasvirlar — mobil ilovalardagi eng og'ir resurs turidir. 12 MP li bitta fotosurat siqilmagan holatda 3–5 MB joy egallashi mumkin. Tasvirlarning Lazy Loading i yuzlab ko'rinmas rasmlarning xotiraga yuklanishini oldini oladi, bu foydalanuvchi izohlari ro'yxatlari yoki mahsulot kataloglari uchun halokatli bo'lar edi.

Android uchun kutubxonalar: Glide va Coil

Glide — keshlash, transformatsiya va animatsiyalarni qo'llab-quvvatlovchi Android uchun eng mashhur rasm yuklash kutubxonasi. Coil — Kotlin tilida korutinlar yordamida yozilgan engilroq alternativ. Ikkala kutubxona ImageView ekranni tark etganda yuklashni avtomatik to'xtatadi va ViewHolder qayta ishlatilganda so'rovlarni bekor qiladi. Coil korutinlardan foydalanadi va ~1.5 MB hajmga ega (~4 MB Glide ga nisbatan), bu uni APK hajmiga e'tibor qaratadigan loyihalar uchun afzal qiladi.

kotlin
// Coil — tasvirni dangasa yuklash
imageView.load("https://example.com/image.jpg") {
    crossfade(true)
    placeholder(R.drawable.placeholder)
    size(512, 512)
    memoryCachePolicy(CachePolicy.ENABLED)
}

iOS uchun kutubxonalar: Kingfisher va SDWebImage

Kingfisher — Swift Concurrency, disk va xotiraga keshlash, shuningdek UICollectionView uchun prefetching ni qo'llab-quvvatlovchi iOS kutubxonasi. SDWebImage — Objective-C ildizlariga ega, ammo Swift ni qo'llab-quvvatlovchi eski kutubxona. Ikkala kutubxona UIImageView bilan integratsiyalashadi va yuklashning hayotiy siklini avtomatik boshqaradi: hujayra qayta ishlatilganda so'rovlarni bekor qiladi, tasvirlarni faqat hujayra ko'rinadigan bo'lganda yuklaydi va xotira yetishmasligi haqida xabarnoma olinganda xotirani bo'shatadi.

Ma'lumotlar va ro'yxatlarning Lazy Loading i

Katta ma'lumotlar ro'yxatlari — mobil ilovalarda Lazy Loading ning asosiy qo'llanish sohasi. Yangiliklar lentasi, mahsulot katalogi, chatlar, operatsiyalar tarixi — potensial cheksiz ro'yxatga ega har bir ekran sahifalash va kechiktirilgan yuklashni talab qiladi.

Android uchun Paging 3

Paging 3 — dangasa yuklashning to'liq siklini amalga oshiruvchi Android Jetpack kutubxonasi: RemoteMediator dan ma'lumot so'rash (API + ma'lumotlar bazasi), Room da keshlash, PagingData orqali sahifalab yetkazish va AsyncPagingDataAdapter orqali ko'rsatish. Paging 3 uch turdagi sahifalashni qo'llab-quvvatlaydi: Page-based (sahifalar), Item-based (offset/limit) va Key-based (API dan sahifalash kalitlari). Separator — yuklash ko'rsatkichlari uchun sahifalar orasidagi ajratgichlarni o'rnatilgan qo'llab-quvvatlash.

kotlin
// Paging 3 — API dan dangasa yuklash
class ArticlePagingSource(
    private val api: ArticleApi
) : PagingSource<Int, Article>() {

    override suspend fun load(
        params: LoadParams<Int>
    ): LoadResult<Int, Article> {
        return try {
            val page = params.key ?: 1
            val response = api.getArticles(page)
            LoadResult.Page(
                data = response.items,
                prevKey = page.takeIf { it > 1 }?.dec(),
                nextKey = page + 1
            )
        } catch (e: Exception) {
            LoadResult.Error(e)
        }
    }
}

SwiftUI LazyVStack va LazyHStack

LazyVStack — SwiftUI ning o'rnatilgan konteyneri bo'lib, elementlarni faqat ekranda paydo bo'lganda yaratadi va renderlaydi. Barcha bola elementlarning layout ini darhol hisoblaydigan VStack dan farqli o'laroq, LazyVStack ko'rinish yaratilishini element ko'rinadigan bo'lguncha yoki prefetch diapazoniga kirguncha kechiktiradi. LazyHStack — karusellar uchun gorizontal analog. Katta hajmdagi ro'yxatlar uchun Apple qo'shimcha o'rnatilgan rekling bilan LazyVStack kabi ishlaydigan List dan foydalanishni tavsiya qiladi.

swift
// SwiftUI — LazyVStack dangasa yuklash bilan
ScrollView {
    LazyVStack(spacing: 8) {
        ForEach(articles) { article in
            ArticleRow(article: article)
                .onAppear {
                    if article == articles.last {
                        viewModel.loadMore()
                    }
                }
        }
    }
}

UI komponentlarining Lazy Loading i

UI komponentlarining dangasa yuklanishi — interfeys qismlari (sarlavhalar, altbilgilar, sozlama bo'limlari, tablar) ekran ishga tushganda emas, balki ularga birinchi murojaat qilinganda yaratiladigan texnikadir. Bu dastlabki renderlashni tezlashtiradi va main thread yukini kamaytiradi.

Android: ViewStub va Fragment dangasa yuklanishi

ViewStub — Android da engil View to'ldiruvchisi bo'lib, layout da joy egallamaydi va inflate() chaqirilgunga qadar bola View larni yaratmaydi. Kam ishlatiladigan bo'limlar uchun ideal: qidiruv paneli, kengaytirilgan sozlamalar, reklama bloklari. Fragment dangasa yuklanishi — Fragment.onCreateView foydalanuvchi shu tabga o'tguncha kechiktiriladigan texnika. ViewPager da isVisible yoki UserVisibleHint orqali amalga oshiriladi.

AndroidX modullarni talab bo'yicha dangasa yuklash uchun SplitInstallManager ni taqdim etadi. Sozlama, diagnostika yoki qo'shimcha funksiyalar modullari faqat foydalanuvchining birinchi so'rovida Dynamic Feature modullari sifatida yuklanadi. Bu ilovaning asosiy hajmini 30–50% ga kamaytiradi va bir vaqtning o'zida prinsipni nafaqat ma'lumot darajasida, balki kod darajasida ham amalga oshiradi.

iOS: TabView va ViewBuilder dangasaligi

TabView SwiftUI da har bir tab mazmunini dangasa — faqat tab faollashtirilganda yuklaydi. UIKit UITabBarController sukut bo'yicha barcha bola kontrollerlarni ishga tushganda yaratadi, lekin bu xatti-harakatni ularni darhol tabBarController.viewControllers ga qo'shmasdan, almashish paytida qo'shish orqali o'zgartirish mumkin. Dinamik qo'shiladigan arrangedSubviews bilan UIStackView ham Lazy Loading prinsipiga amal qiladi — Subview ni faqat foydalanuvchi interfeysning ushbu qismini talab qiladigan amalni bajarganda qo'shing.

Ekran yuklanishini optimallashtirish uchun Lazy Loading ni barcha darajalarda birlashtiring: kam ishlatiladigan bo'limlar uchun ViewStub, ma'lumotlar uchun Paging 3, tasvirlar uchun Glide/Coil va Hilt/Dagger Scopes yoki Swinject orqali ViewModel ni dangasa ishga tushirish. Bunday yondashuv hatto 3 GB operativ xotirali byudjet qurilmalarida ham 200–400 ms da yuklanadigan ekranni beradi.

Ko'p beriladigan savollar

Qaysi hollarda Lazy Loading ni ishlatmaslik kerak?

Agar ekran kafolatlangan holda oz sonli element (20 tagacha) ko'rsatsa va ularning barchasi darhol kerak bo'lsa — Lazy Loading ortiqcha. Kam aylantiriladigan ro'yxatlar uchun Eager Loading sezilarli ishlash yo'qotishlarisiz tatbiq qilish osonroq va tezroq bo'lishi mumkin.

Lazy Loading xotiraga qanday ta'sir qiladi?

Katta ro'yxatlar uchun cho'qqi xotira sarfini 3–10 baravar kamaytiradi, chunki xotirada faqat ko'rinadigan elementlar va prefetch buferi saqlanadi. Biroq, prefetch va tasvir keshlashni qo'shish boshqarilishi kerak bo'lgan mo''tadil xotira sarfini yaratadi.

SwiftUI da LazyVStack yoki List ni tanlashim kerak?

List surish, tortish va o'rnatilgan tanlash imkoniyati bilan bir xil ma'lumotlar uchun afzal. LazyVStack — har xil turdagi hujayralar, bo'limlar va nostandart bo'shliqlar bilan maxsus layout lar uchun. List ichki tomondan qo'shimcha funksionallik bilan LazyVStack kabi ishlaydi.

Dangasa yuklash bilan bog'liq muammolarni qanday tuzatish kerak?

Android da View iyerarxiyasini ko'rish uchun Layout Inspector dan foydalaning: Lazy Loading da elementlarning ko'pchiligi daraxtda bo'lmasligi kerak. iOS da — Xcode Debug View Hierarchy. Aylantirish paytida barcha elementlar mavjud bo'lsa — Lazy Loading ishlamaydi.

Nima muhimroq — yuklash tezligi yoki xotira tejash?

Ikkala parametr ham muhim, ammo ustuvorlik platformaga bog'liq. ARC va samarali xotira boshqaruvi bilan iOS da ustuvorlik yuklash tezligidir. JVM va GC bilan Android da ustuvorlik xotira tejashdir, chunki main thread dagi har bir alokatsiya GC friziga sabab bo'lishi mumkin.

Xulosa

  • Lazy Loading — birinchi ishga tushirishni tezlashtiradigan va xotirani tejaydigan kechiktirilgan yuklash namunasi
  • Tasvirlar Glide, Coil, Kingfisher orqali faqat viewport ga kirganda yuklanadi
  • Paging 3 Android uchun Room da keshlash bilan sahifalab ma'lumot yuklashni ta'minlaydi
  • LazyVStack SwiftUI da elementlarning renderini ekranda paydo bo'lguncha kechiktiradi
  • ViewStub Android da — UI komponentlarini birinchi murojaatda dangasa yuklash
  • Prefetch buferi — silliq aylantirish uchun oldindan yuklash
  • Lazy Loading ni barcha darajalarda birlashtiring: ma'lumotlar + tasvirlar + UI

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.

Loyihani muhokama qilish

Shuningdek o'qing