Lazy Loading in der mobilen Entwicklung — Funktionsweise, Prinzipien und Implementierung

Autor: IT Sectr Veröffentlicht: 2026-04-01 Lesezeit: 9 Min.

Lazy Loading ist eine Strategie zum verzögerten Laden von Daten, Bildern und Komponenten, bei der Ressourcen nicht beim App-Start, sondern erst dann angefordert werden, wenn der Benutzer sie tatsächlich benötigt. Laut dem Android Paging 3 Guide reduziert das verzögerte Laden von Listen den Speicherverbrauch um 60–80% bei der Arbeit mit großen Datensätzen. Die verzögerte Initialisierung ist das Schlüsselprinzip, das allen Lazy Loading-Implementierungen zugrunde liegt.

Zusammenfassung

  • Lazy Loading ist ein verzögertes Ladenmuster, das Speicher spart und den ersten Start beschleunigt
  • LazyVStack und LazyHStack sind integrierte SwiftUI-Komponenten für verzögerte Listen
  • Paging 3 ist eine Android-Bibliothek für seitenweises Laden von Daten aus API und Datenbank
  • Bildbibliotheken (Glide, Coil, Kingfisher) laden Bilder nur, wenn sie auf dem Bildschirm erscheinen
  • Preloading ist vorausschauendes Laden, die Kehrseite von Lazy Loading für eine flüssige UX

Was ist Lazy Loading

Lazy Loading (verzögertes Laden, Träges Laden) ist ein Entwurfs- und Optimierungsmuster, bei dem Anwendungsressourcen nicht beim Start, sondern unmittelbar vor der Verwendung geladen werden. In der mobilen Entwicklung wird Lazy Loading auf drei Hauptkategorien angewendet: Daten (Listen-Paginierung), Bilder (Laden beim Scrollen) und Komponenten (verzögerte Stacks und Views).

Das Gegenteil von Lazy Loading ist Eager Loading (vorzeitiges Laden), bei dem alle Ressourcen beim Bildschirmstart geladen werden. Eager Loading ist einfacher zu implementieren, verbraucht aber mehr Speicher und erhöht die Zeit bis zur ersten Anzeige. Bei Listen mit Tausenden von Elementen führt Eager Loading auf Geräten mit begrenztem Speicher zu OOM (Out of Memory). Lazy Loading löst dieses Problem, indem es nur das lädt, was auf dem Bildschirm sichtbar ist, und den Rest lädt, während der Benutzer scrollt.

Im Kontext von iOS und Android wird Lazy Loading auf verschiedenen Ebenen implementiert. SwiftUI bietet LazyVStack und LazyHStack für verzögertes Rendern. UIKit verwendet UITableView mit dequeueReusableCell. Android verwendet RecyclerView mit einem ViewHolder-Pool. Auf Datenebene: Room mit Paging 3 und Core Data mit NSFetchedResultsController. Die Wahl der spezifischen Technologie hängt vom Stack und den Leistungsanforderungen ab.

Prinzipien der verzögerten Ladung

Das zentrale Prinzip von Lazy Loading besteht darin, genau die Datenmenge zu laden, die für den aktuellen Bildschirmzustand benötigt wird, plus einen vorausschauenden Puffer für flüssiges Scrollen. Dieser Ansatz basiert auf zwei Mechanismen: Sichtbarkeitsverfolgung und Elementvirtualisierung.

Sichtbarkeitsverfolgung

Der Verfolgungsmechanismus bestimmt, welche Elemente sich im sichtbaren Bereich des Bildschirms (Viewport) befinden. Auf Android erledigt dies LinearLayoutManager oder GridLayoutManager über die Methoden findFirstVisibleItemPosition und findLastVisibleItemPosition. In iOS stellt UIScrollView bounds.origin.y und contentOffset.height zur Berechnung des sichtbaren Bereichs bereit. Wenn ein Element in den Viewport (oder den Prefetch-Puffer) eintritt, wird sein Laden gestartet. Wenn ein Element den Bildschirm verlässt, können seine Ressourcen freigegeben oder in den Cache verschoben werden.

kotlin
// Android — Sichtbarkeitsverfolgung im RecyclerView
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
        // Lade nächste Seite, wenn noch welche übrig sind < 5 Elemente
        if (lastVisible >= totalCount - 5) {
            loadMoreItems()
        }
    }
})

Pufferung und Prefetch

Der Prefetch-Puffer ist das vorausschauende Laden von Elementen, die bald auf dem Bildschirm erscheinen werden. RecyclerView unterstützt GapWorker.Prefetch über layoutManager.setItemPrefetchEnabled(true). iOS UITableView unterstützt Prefetching über UITableViewDataSourcePrefetching. Die Größe des Prefetch-Puffers beträgt typischerweise 1–2 Bildschirme im Voraus, was einen Kompromiss zwischen Scrollflüssigkeit und Speicherverbrauch darstellt. Ein zu großer Prefetch-Puffer macht die Vorteile von Lazy Loading zunichte; ein zu kleiner Puffer erzeugt bei schnellem Scrollen leere Stellen.

Lazy Loading von Bildern

Bilder sind die schwerste Ressourcenart in mobilen Anwendungen. Ein einzelnes 12-MP-Foto kann unkomprimiert 3–5 MB belegen. Lazy Loading von Bildern verhindert das Laden von Hunderten unsichtbarer Bilder in den Speicher, was für Listen mit Benutzeravataren oder Produktkatalogen fatal wäre.

Bibliotheken für Android: Glide und Coil

Glide ist die beliebteste Bildladebibliothek für Android mit Unterstützung für Caching, Transformationen und Animationen. Coil ist eine leichtere Alternative, die in Kotlin mit Coroutinen geschrieben wurde. Beide Bibliotheken pausieren das Laden automatisch, wenn eine ImageView den Bildschirm verlässt, und brechen Anfragen ab, wenn ein ViewHolder wiederverwendet wird. Coil verwendet Coroutinen und ist ~1,5 MB groß im Vergleich zu ~4 MB von Glide, was es für Projekte mit Fokus auf APK-Größe bevorzugt macht.

kotlin
// Coil — verzögertes Laden von Bildern
imageView.load("https://example.com/image.jpg") {
    crossfade(true)
    placeholder(R.drawable.placeholder)
    size(512, 512)
    memoryCachePolicy(CachePolicy.ENABLED)
}

Bibliotheken für iOS: Kingfisher und SDWebImage

Kingfisher ist eine Bibliothek für iOS mit Unterstützung für Swift Concurrency, Festplatten- und Arbeitsspeicher-Caching sowie Prefetching für UICollectionView. SDWebImage ist eine ältere Bibliothek mit Objective-C-Wurzeln, aber mit Swift-Unterstützung. Beide Bibliotheken integrieren sich mit UIImageView und verwalten den Ladeprozess automatisch: Sie brechen Anfragen bei Wiederverwendung einer Zelle ab, laden Bilder nur, wenn die Zelle sichtbar ist, und geben Speicher bei einer Speicherwarnung frei.

Lazy Loading von Daten und Listen

Große Datenlisten sind der Hauptanwendungsbereich von Lazy Loading in mobilen Apps. Nachrichten-Feeds, Produktkataloge, Chats, Transaktionsverlauf — jeder Bildschirm mit einer potenziell unendlichen Liste erfordert Paginierung und verzögertes Laden.

Paging 3 für Android

Paging 3 ist eine Bibliothek aus Android Jetpack, die den vollständigen Lazy-Loading-Zyklus implementiert: Datenanforderung von RemoteMediator (API + Datenbank), Caching in Room, seitenweise Ausgabe über PagingData und Anzeige über AsyncPagingDataAdapter. Paging 3 unterstützt drei Arten der Paginierung: seitenbasiert, elementbasiert (Offset/Limit) und schlüsselbasiert (Paginierungsschlüssel von der API). Separator ist die integrierte Unterstützung für Trennzeichen zwischen Seiten für Ladeindikatoren.

kotlin
// Paging 3 — verzögertes Laden von der API
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 und LazyHStack

LazyVStack ist ein integrierter SwiftUI-Container, der Elemente nur dann erstellt und rendert, wenn sie auf dem Bildschirm erscheinen. Im Gegensatz zu VStack, das sofort das Layout aller untergeordneten Elemente berechnet, verschiebt LazyVStack die Erstellung der View, bis das Element sichtbar wird oder in den Prefetch-Bereich eintritt. LazyHStack ist das horizontale Gegenstück für Karussells. Für große Listen empfiehlt Apple die Verwendung von List, das intern ähnlich wie LazyVStack mit zusätzlichem integriertem Recycling arbeitet.

swift
// SwiftUI — LazyVStack mit verzögertem Laden
ScrollView {
    LazyVStack(spacing: 8) {
        ForEach(articles) { article in
            ArticleRow(article: article)
                .onAppear {
                    if article == articles.last {
                        viewModel.loadMore()
                    }
                }
        }
    }
}

Lazy Loading von UI-Komponenten

Verzögertes Laden von UI-Komponenten ist eine Technik, bei der Teile der Benutzeroberfläche (Kopfzeilen, Fußzeilen, Einstellungsabschnitte, Registerkarten) nicht beim Bildschirmstart, sondern beim ersten Zugriff erstellt werden. Dies beschleunigt das anfängliche Rendern und verringert die Belastung des Hauptthreads.

Android: ViewStub und verzögertes Laden von Fragmenten

ViewStub ist ein leichter View-Platzhalter in Android, der im Layout keinen Platz einnimmt und keine untergeordneten Views erstellt, bis inflate() aufgerufen wird. Ideal für selten genutzte Bereiche: Suchfeld, erweiterte Einstellungen, Werbeblöcke. Verzögertes Laden von Fragmenten ist eine Technik, bei der Fragment.onCreateView verschoben wird, bis der Benutzer zu dieser Registerkarte wechselt. Implementiert wird dies über isVisible oder UserVisibleHint im ViewPager.

AndroidX bietet SplitInstallManager für das verzögerte Laden von Modulen auf Anfrage. Setup-, Diagnose- oder Zusatzfunktionsmodule werden nur bei der ersten Anfrage des Benutzers als Dynamic Feature-Module geladen. Dies reduziert die Basis-App-Größe um 30–50% und implementiert gleichzeitig das Prinzip von Lazy Loading nicht nur auf Datenebene, sondern auch auf Codeebene.

iOS: TabView und ViewBuilder-Trägheit

TabView in SwiftUI lädt den Inhalt jeder Registerkarte verzögert — nur wenn die Registerkarte aktiviert wird. UIKit UITabBarController erstellt standardmäßig alle untergeordneten Controller beim Start, aber dieses Verhalten kann geändert werden, indem sie nicht sofort zu tabBarController.viewControllers hinzugefügt und beim Wechsel des Benutzers ersetzt werden. UIStackView mit dynamisch hinzugefügten arrangedSubviews folgt ebenfalls dem Lazy Loading-Prinzip — fügen Sie eine Subview nur hinzu, wenn der Benutzer eine Aktion ausführt, die diesen Teil der Oberfläche erfordert.

Zur Optimierung des gesamten Bildschirmladens kombinieren Sie Lazy Loading auf allen Ebenen: ViewStub für selten genutzte Abschnitte, Paging 3 für Daten, Glide/Coil für Bilder und verzögerte ViewModel-Initialisierung über Hilt/Dagger Scopes oder Swinject. Dieser Ansatz ergibt einen Bildschirm, der selbst auf günstigen Geräten mit 3 GB RAM in 200–400 ms lädt.

Häufig gestellte Fragen

Wann sollte Lazy Loading nicht verwendet werden?

Wenn der Bildschirm garantiert wenige Elemente (bis zu 20) anzeigt und alle sofort benötigt werden, ist Lazy Loading übertrieben. Für Listen, die selten gescrollt werden, kann Eager Loading ohne merkliche Leistungseinbußen einfacher und schneller zu implementieren sein.

Wie wirkt sich Lazy Loading auf den Speicher aus?

Es reduziert den Spitzenspeicherverbrauch bei großen Listen um das 3- bis 10-Fache, da nur die sichtbaren Elemente plus der Prefetch-Puffer im Speicher gehalten werden. Das Hinzufügen von Prefetch und Bild-Caching erzeugt jedoch einen moderaten Speichermehrverbrauch, der verwaltet werden muss.

Was ist zu wählen — LazyVStack oder List in SwiftUI?

List ist für homogene Daten mit Wisch-, Drag-and-Drop- und integrierter Auswahlunterstützung zu bevorzugen. LazyVStack ist für benutzerdefinierte Layouts mit verschiedenen Zelltypen, Abschnitten und nicht standardmäßigen Abständen. List arbeitet intern wie LazyVStack mit zusätzlicher Funktionalität.

Wie debuggt man Probleme mit verzögertem Laden?

Verwenden Sie unter Android den Layout Inspector, um die View-Hierarchie anzuzeigen: Bei Lazy Loading sollten die meisten Elemente im Baum fehlen. Unter iOS verwenden Sie Xcode Debug View Hierarchy. Wenn beim Scrollen alle Elemente vorhanden sind, funktioniert Lazy Loading nicht.

Was ist wichtiger — Ladegeschwindigkeit oder Speichereinsparung?

Beide Parameter sind wichtig, aber die Priorität hängt von der Plattform ab. Auf iOS mit ARC und effizientem Speichermanagement hat die Ladegeschwindigkeit Priorität. Auf Android mit JVM und GC hat die Speichereinsparung Priorität, da jede Speicherzuweisung im Hauptthread einen GC-Freeze verursachen kann.

Zusammenfassung

  • Lazy Loading ist ein verzögertes Ladenmuster, das den ersten Start beschleunigt und Speicher spart
  • Bilder werden nur beim Eintritt in den Viewport über Glide, Coil, Kingfisher geladen
  • Paging 3 für Android bietet seitenweises Laden von Daten mit Room-Caching
  • LazyVStack in SwiftUI verschiebt das Rendern von Elementen, bis sie auf dem Bildschirm erscheinen
  • ViewStub in Android — verzögertes Laden von UI-Komponenten beim ersten Zugriff
  • Prefetch-Puffer — vorausschauendes Laden für flüssiges Scrollen
  • Kombinieren Sie Lazy Loading auf allen Ebenen: Daten + Bilder + UI

Wir entwickeln eine mobile Applikation schlüsselfertig

IT Sectr entwickelt seit 2017 iOS- und Android-Apps für Startups und Unternehmen. Wir beraten Sie und schlagen die beste Lösung vor.

Projekt besprechen

Lesen Sie auch