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)
    }
}