Practicas_aplicadas_para_consumo_de_memoria - 5x5x5-cube/vinilos-app GitHub Wiki
Buenas prácticas aplicadas para consumo de memoria
Durante el desarrollo en el Sprint 2 del proyecto Vinilos App, se aplicaron diversas buenas prácticas enfocadas en optimizar el consumo de memoria, evitando fugas, cargas innecesarias en el heap y garantizando fluidez en dispositivos con recursos limitados. A continuación, se describen las principales implementadas:
1. Uso de ViewModel y LiveData para gestión eficiente del estado
Se utilizaron clases que extienden AndroidViewModel
, como AlbumViewModel.kt
, para mantener los datos persistentes entre recomposiciones y ciclos de vida. Esta estrategia evita la recarga innecesaria de datos, reduciendo el uso de memoria durante la navegación o cambios en la UI. El estado es observado desde la UI con observeAsState()
.
Ejemplo:
val albums by albumViewModel.albums.observeAsState(initial = emptyList())
2. LazyColumn para renderizado eficiente de listas
Las listas de álbumes, artistas y coleccionistas se renderizan mediante LazyColumn
, componente optimizado que solo mantiene en memoria los ítems visibles. Esto reduce el impacto en la memoria frente a listas largas.
Ejemplo:
LazyColumn(...) {
items(albums) { album ->
AlbumRow(album = album, ...)
Divider()
}
}
3. Carga de imágenes optimizada con Coil y tamaños controlados
Se usó AsyncImage
de la librería Coil con tamaños explícitos (.size(48.dp)
), evitando que imágenes de alta resolución ocupen más memoria de la necesaria.
Ejemplo:
AsyncImage(
model = album.cover,
contentDescription = "Portada de ${album.name}",
modifier = Modifier.size(48.dp)
)
4. Inicialización segura de listas en estado vacío
Se inicializó el estado con listas vacías (initial = emptyList()
), lo que evita referencias nulas o inicializaciones pesadas innecesarias.
Ejemplo:
val albums by albumViewModel.albums.observeAsState(initial = emptyList())
5. Uso de corrutinas con Dispatchers.IO para tareas pesadas
Las operaciones de red y parsing de JSON se ejecutan fuera del hilo principal utilizando Dispatchers.IO
, lo cual reduce el riesgo de bloqueos, picos de memoria o congelamiento de la app.
Ejemplo:
viewModelScope.launch(Dispatchers.Default) {
withContext(Dispatchers.IO) {
val data = albumsRepository.getAlbums()
_albums.postValue(data)
}
}