Buenas prácticas aplicadas para consumo de memoria (Sprint 3) - 5x5x5-cube/vinilos-app GitHub Wiki

Durante el desarrollo del Sprint 3 del proyecto Vinilos App, se continuaron aplicando prácticas para optimizar el consumo de memoria, adaptadas a las nuevas vistas y funcionalidades agregadas. A continuación, se describen las medidas adoptadas para garantizar un uso eficiente de recursos en las tres historias implementadas:

1. Desacoplamiento de lógica de UI y carga de datos

El uso de LiveData junto con viewModelScope.launch permite que la vista observe únicamente el resultado, manteniendo la lógica de negocio y acceso a red en repositorios y fuera de la UI, evitando referencias pesadas en componentes visuales.

Ejemplo:

Copiar
Editar
viewModelScope.launch {
    albumsRepository.createAlbum(album)
    _createSuccess.value = true
}

2. Scroll manual con verticalScroll en formularios

En las pantallas CreateAlbumScreen y AddTrackScreen, se usó Column con verticalScroll() para renderizar formularios largos sin inflar el layout completo, permitiendo un renderizado progresivo y menos exigente en memoria.

Ejemplo:

Copiar
Editar
Column(
    modifier = Modifier.verticalScroll(rememberScrollState())
)

3. Prevención de recreaciones innecesarias en recomposición

Los DatePickerDialog, DropdownMenu y valores temporales como calendar fueron creados usando remember y rememberSaveable donde fue necesario, minimizando la creación de objetos durante cada recomposición.

Ejemplo:

Copiar
Editar
val calendar = Calendar.getInstance()
val datePickerDialog = DatePickerDialog(...)

4. Gestión de estado con ViewModel y LiveData

Se usaron clases AndroidViewModel en CreateAlbumViewModel, CreateTrackViewModel y CollectorDetailsViewModel para manejar el estado de forma persistente, asegurando que los datos sobrevivan a recomposiciones y rotaciones sin recargarse innecesariamente.

Ejemplo:

Copiar
Editar
val collector = viewModel.collector.observeAsState().value
val name by viewModel.name.observeAsState("")
Esto minimiza recreaciones de objetos, evitando cargas innecesarias en memoria.

5. Listas optimizadas con LazyColumn

En la vista CollectorDetailScreen, se utilizó LazyColumn para mostrar los artistas favoritos del coleccionista. Esta implementación asegura que solo los elementos visibles estén en memoria, mejorando la eficiencia frente a listas largas.

Ejemplo:

Copiar
Editar
LazyColumn {
    item {
        collector.performers.forEach { performer ->
            FavoritePerformerItem(performer)
        }
    }
}

6. Control de cargas de imagen con Coil

Se utilizó AsyncImage con dimensiones explícitas para mostrar portadas de álbumes y fotos de artistas en CreateAlbumScreen y CollectorDetailScreen. Esto limita el espacio de memoria usado por cada imagen cargada.

Ejemplo:

Copiar
Editar
AsyncImage(
    model = performer.image,
    contentDescription = "Imagen de ${performer.name}",
    modifier = Modifier.size(48.dp),
    contentScale = ContentScale.Crop
)