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@Composable
2fun 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@Composable
2fun OptimizedUserList(users: List<User>) {
3LazyColumn {
4items(
5items = users,
6key = { user -> user.id } // Benzersiz anahtar
7) { user ->
8UserCard(user)
9}
10}
11}
12
13@Composable
14fun 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.

Reklam · TEST
AdSense Test ReklamıYazı arası (gönderi içi) · Yazı arası

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)
3
4@Composable
5fun 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@Composable
2fun ImageList(imageUrls: List<String>) {
3LazyColumn {
4items(imageUrls) { url ->
5Image(
6painter = rememberAsyncImagePainter(url),
7contentDescription = null,
8modifier = Modifier.fillMaxWidth().height(200.dp),
9contentScale = ContentScale.Crop
10)
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.

Reklam · TEST
AdSense Test ReklamıGönderi altı · Görüntülü
konu hakkında tepkinizi verebilirsiniz
  • minikbirhesap

    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.

  • biriktirdiklerim

    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.

  • mavidefter

    state karışması yaşadım ben de, key() olmadan kaydırırken textbox'taki yazı yer değiştiriyordu.