Android Jetpack Compose LazyColumn: Bellek Yönetimi
# Android Jetpack Compose LazyColumn: Bellek Yönetimi
Bir uygulamada 10.000 öğeli bir liste göstermek gerekirse, tüm öğeleri bir kez oluşturmak belleği tıkayıp uygulamayı yavaşlatır. LazyColumn sadece ekranda görünen öğeleri render eder. Kullanıcı kaydırınca yeni öğeler oluşturulur, eski olanlar silinir.
Basit bir listeyi LazyColumn ile göstermek:
1@Composable2fun UserList(users: List<String>) {3LazyColumn {4items(users) { user ->5Text(6text = user,7modifier = Modifier.padding(16.dp).fillMaxWidth()8)9}10}11}Çıktı: Ekrana sığan kadar kullanıcı adı görünür, kaydırıldıkça yenileri yüklenir.
Composable'lar gereksiz yere yeniden oluşturulursa bellek tüketimi artar. Bunu önlemek için key() kullanın:
1@Composable2fun OptimizedUserList(users: List<User>) {3LazyColumn {4items(5items = users,6key = { user -> user.id } // Benzersiz anahtar7) { user ->8UserCard(user)9}10}11}1213@Composable14fun UserCard(user: User) {15Card(16modifier = Modifier.padding(8.dp).fillMaxWidth()17) {18Text("${user.name} - ${user.email}")19}20}Çıktı: Her kullanıcı kendi ID'si ile takip edilir, liste yeniden sıralanırsa gereksiz yeniden render olmaz.
Farklı türdeki öğelerin ayrı ayrı render edilmesi bellek kullanımını optimize eder:
1data class User(val id: Int, val name: String)2data class Header(val title: String)34@Composable5fun MixedList(items: List<Any>) {6LazyColumn {7items(8items = items,9contentType = { item ->10when (item) {11is Header -> "header"12is User -> "user"13else -> "unknown"14}15}16) { item ->17when (item) {18is Header -> Text(item.title, fontSize = 20.sp, fontWeight = FontWeight.Bold)19is User -> Text(item.name, modifier = Modifier.padding(16.dp))20}21}22}23}Çıktı: Header'lar ve kullanıcılar farklı türler olarak işlenir, Compose optimize edebilir.
Büyük resimleri LazyColumn'da gösterirken rememberAsyncImagePainter kullanın:
1@Composable2fun ImageList(imageUrls: List<String>) {3LazyColumn {4items(imageUrls) { url ->5Image(6painter = rememberAsyncImagePainter(url),7contentDescription = null,8modifier = Modifier.fillMaxWidth().height(200.dp),9contentScale = ContentScale.Crop10)11}12}13}Çıktı: Resimler arka planda asenkron yüklenir, UI donmaz.
- LazyColumn sadece görünen öğeleri render eder.
- key() gereksiz yeniden oluşturmayı önler.
- contentType farklı öğe türlerini optimize eder.
- Asenkron yükleme (resim, veri) performansı artırır.
Bu yöntemler 10.000+ öğeli listelerde bile sorunsuz çalışma sağlar.
3 yorum
10 binli listeyi hepsini bir kez yüklemek yerine sadece ekrandakini göstermek mantıklı, kaydırırken dinamik olarak güncelleniyorsa hiç sorun olmaz.
key() kullanmazsanız kaydırırken liste karışabiliyor, mesela 5. öğe silinip yeni bir öğe gelince Compose 5. sırayı yeniden çiziyor ama aynı state'i saklıyor. ID verince bu sorun çözülüyor.
state karışması yaşadım ben de, key() olmadan kaydırırken textbox'taki yazı yer değiştiriyordu.