Micro Optimizaciones Implementadas3 - gorozcoua/team18 GitHub Wiki

Reporte de Microoptimizaciones Implementadas - Proyecto Vinilos

1. Optimizaciones en la Carga de Imágenes

Implementación de Glide con Caché

Glide.with(holder.itemView.context)
    .load(album.cover)
    .apply(RequestOptions()
    .diskCacheStrategy(DiskCacheStrategy.ALL))
    .into(holder.albumImage)
  • Uso de DiskCacheStrategy.ALL para almacenar imágenes en disco
  • Caché de imágenes para reducir el consumo de datos
  • Carga eficiente de imágenes con redimensionamiento automático

2. Optimizaciones en RecyclerViews

Implementación de ViewHolders

  • Uso de ViewHolder para reutilizar vistas
  • Reducción de llamadas a findViewById
  • Mejor rendimiento en listas largas

Layouts Optimizados

android:clipToPadding="false"
android:overScrollMode="never"
android:scrollbars="none"
  • Desactivación de efectos de scroll innecesarios
  • Optimización de rendimiento en desplazamiento
  • Reducción de sobrecarga visual

3. Optimizaciones en Corrutinas

Uso de Dispatchers Específicos

viewModelScope.launch(Dispatchers.Default) {
    withContext(Dispatchers.IO) {
        val data = repository.refreshData()
        _data.postValue(data)
    }
}
  • Uso de Dispatchers.IO para operaciones de red
  • Uso de Dispatchers.Default para operaciones de CPU
  • Mejor gestión de hilos y recursos

4. Optimizaciones en el Manejo de Datos

Lazy Loading

  • Carga de datos bajo demanda
  • Implementación de paginación en listas
  • Reducción de consumo de memoria

Manejo Eficiente de Strings

albumReleaseDate.text = "Lanzamiento: ${album.releaseDate.take(10)}"
  • Uso de take() para limitar longitud de strings
  • Formateo eficiente de fechas
  • Reducción de procesamiento innecesario

5. Optimizaciones en la UI

RecyclerView Horizontal

layoutManager = LinearLayoutManager(requireContext(), LinearLayoutManager.HORIZONTAL, false)
  • Implementación de scroll horizontal eficiente
  • Optimización para diferentes tamaños de pantalla
  • Mejor experiencia de usuario

Manejo de Errores

private val _eventNetworkError = MutableLiveData(false)
private val _isNetworkErrorShown = MutableLiveData(false)
  • Sistema robusto de manejo de errores
  • Prevención de crashes
  • Mejor experiencia de usuario

6. Optimizaciones en el Rendimiento

Singleton Pattern

companion object {
    private var instance: NetworkServiceAdapter? = null
    fun getInstance(context: Context) =
        instance ?: synchronized(this) {
            instance ?: NetworkServiceAdapter(context).also {
                instance = it
            }
        }
}
  • Implementación de Singleton para servicios
  • Reducción de instancias innecesarias
  • Mejor gestión de memoria

Lazy Initialization

private val requestQueue: RequestQueue by lazy {
    Volley.newRequestQueue(context.applicationContext)
}
  • Inicialización perezosa de recursos
  • Mejor gestión de memoria
  • Optimización de inicio de aplicación

7. Optimizaciones en el Manejo de Fechas

Formateo Eficiente

fun formatBirthDateLegacy(dateString: String): String {
    val inputFormat = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss", Locale.US)
    val outputFormat = SimpleDateFormat("d 'de' MMMM 'de' yyyy", Locale("es", "ES"))
    val date = inputFormat.parse(dateString)
    return outputFormat.format(date ?: Date())
}
  • Uso de Locale específico para formateo
  • Manejo eficiente de fechas
  • Mejor internacionalización

7. Sistema de Caché en Memoria

Implementación del CacheManager

  • Se ha implementado un sistema de caché en memoria utilizando el patrón Singleton para garantizar una única instancia del gestor de caché.
  • El CacheManager mantiene cuatro tipos de datos en caché:
    • Tracks (pistas musicales)
    • Albums (álbumes)
    • Musicians (músicos)
    • Albums por músico

Beneficios de la Caché

  1. Reducción de llamadas a la red:

    • Los datos se almacenan en memoria después de la primera solicitud
    • Las solicitudes subsecuentes se sirven desde la caché
    • Se evitan llamadas innecesarias al servidor
  2. Mejor rendimiento:

    • Acceso instantáneo a datos frecuentemente utilizados
    • Reducción de latencia en la interfaz de usuario
    • Menor consumo de datos móviles

8. Optimizaciones en los Repositorios

Implementación de Repositorios Optimizados

Los repositorios (AlbumRepository, MusicianRepository, AlbumDetailRepository, MusicianDetailRepository) implementan una lógica de caché inteligente:

  1. Verificación de Caché:

    val potentialResp = cache.getAlbums()
    return if (potentialResp.isEmpty()) {
        // Obtener de la red
    } else {
        // Usar caché
    }
    
  2. Manejo de Errores:

    • Implementación de bloques try-catch para manejar fallos de red
    • Retorno de listas vacías en caso de error para evitar crashes

9. Optimizaciones de Memoria

Configuración de Gradle

  • Configuración optimizada de memoria para el proceso de compilación:
    org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8
    

Optimizaciones de Android

  • Uso de AndroidX para mejor gestión de recursos
  • Implementación de android.nonTransitiveRClass=true para reducir el tamaño de las clases R

Este reporte muestra que el proyecto Vinilos ha implementado varias microoptimizaciones significativas, especialmente en el manejo de datos y la gestión de memoria, lo que resulta en una aplicación más eficiente y con mejor rendimiento.