Lag is zelden alleen het toestel
Stotterende scroll in een feed voelt voor gebruikers als een trage telefoon. In de praktijk zijn het vaak extra recompositions, werk op de main thread en gebrek aan ART-warmup. Deze zeven tweaks gebruiken we in echte projecten.
1. Meet eerst, optimaliseer daarna
Gebruik Android Studio Profiler (CPU, Memory, Energy) en leg een baseline vast op je doeldevice. Zonder cijfers optimaliseer je op gevoel — en dat lieg je regelmatig tegen.
2. Macrobenchmark voor cold start
Macrobenchmark maakt cold start en scroll jank zichtbaar tussen builds. Eén
zware init in Application.onCreate kan honderden milliseconden
kosten zonder dat je het in de UI meteen ziet.
3. Baseline Profiles niet overslaan
Genereer baseline profiles voor je belangrijkste flows: home, feed, checkout. ART compileert hot paths eerder, waardoor de eerste scroll merkbaar vloeiender wordt. Gratis winst die veel teams te laat ontdekken.
4. LazyColumn: keys en lichte items
Geef list items altijd een stabiele key. Zware parsing, datumformatting
en mapping horen niet in elke recomposition van je card composable.
LazyColumn {
items(posts, key = { it.id }) { post ->
PostCard(post = post, onClick = onPostClick)
}
}
5. Slim cache-en
Gebruik memory + persistent cache (Room/DataStore) om herhaalde network calls te vermijden. Voor images: Coil met resize naar de echte view-grootte. Geen 4K assets in een 360dp card.
6. Compose state: klein houden
Houd state zo dicht mogelijk bij de consumer. Een grote state blob op root-niveau
triggert onnodige recompositions. Gebruik ViewModel + derivedStateOf
waar je aggregaties nodig hebt zonder spam-updates.
7. Geen zware taken op main
Coroutines met de juiste dispatcher: IO voor disk/network, Default voor CPU. Geen synchrone parsing “even snel” in de UI-thread — daar beginnen ANR’s.
Conclusie
Snelheid is een teamgewoonte. Houd een perf-budget aan (bijv. cold start < 1.2s), benchmark na grote PR’s en ruil geen smooth scroll in voor nog een fullscreen animatie die niemand nodig heeft.