wfspain android app - imágenes y persistencia
TRANSCRIPT
Imágenes, Loaders y Persistencia
¿EN QUÉ CONSISTE LA APP?
• Es una app Android para poder hacer uso como usuario de la web wedfotospain.com.
• Permite buscar y pedir fotógrafos de boda según donde vivas, tu presupuesto, tu estilo…
• Tiene un repertorio muy amplio de fotógrafos de gran calidad con galerías.
Puntos clave:
3 meses de desarrollo.
Imágenes
Persistencia de datos
Carga de datos
MUCHAS IMÁGENES, POCA RAM
• Apps Android tienen poca RAM: 16MB - 288MB
• JPGs de 50KB pueden ser 7MB-10MB en bitmap.
• Muchas imágenes = app sin imágenes. OutOfMemoryException.
LIBRERÍAS DE CARGA DE IMÁGENES
Universal Image Loader:
• Altamente configurable.
• Permite decir qué tipo de caché usar, cuándo y su tamaño.
• IMPORTANTE: Sólo puede cargar imágenes en el hilo de la UI (hasta versión 1.9.2).
Square’s Picasso:
• Muy sencillo de usar.
• Poco configurable.
• Puede cargar imágenes donde quiera.
• Evitar cargar imágenes con getDrawable() o en XML:
• Carga las imágenes a máxima calidad (JPGs con canal alpha).
• Usar la configuración RGB_565 que consume mucho menos que la ARGB_8888.
• Usar BitmapFactory.inJustDecodeBounds para saber el tamaño del Bitmap y BitmapFactory.inSampleSize para cargarla con mejor o peor calidad u outWidth u outHeight para el tamaño exacto.
LOADERS
• Permiten cargar datos en segundo plano:
• Enmascaran el origen.
• Se adaptan a los giros de pantalla y otros cambios.
• Tienen callbacks.
CÓMO USARLOS• La Activity o Fragment debe implementar
LoaderManager.LoaderCallbacks<T>.
• Debe pedirse que se registre el Loader con getLoaderManager().initLoader(id, bundle, callback).
• onCreateLoader() debe devolver una instancia del Loader que se vaya a usar.
CÓMO USARLOS• onLoadFinished() se encargará de actualizar la UI con
los datos cargados del Loader.
• Distintos tipos de Loaders:
• Loader.
• CursorLoader.
• AsyncTaskLoader - usado aquí.
PERSISTENCIA:
• El 90% del contenido de la app proviene de API online.
• Es necesario garantizar la persistencia de los datos descargados y su coherencia con los dados por la API.
PERSISTENCIA• Para ello: SQLite y llamadas a API Rest.
• Problemas:
• DB de Web no adaptada a API:
• No hay tombstones.
• No hay timestamps aprovechables.
• No hay sistema de login por tokens o similares.
• Datos muy dependientes. Un fallo en la cadena puede dejar muy tocada la app.
MÁS PROBLEMAS
• ORM en Android está poco avanzado. Toca hacerlo a mano.
• Conexión va y viene. ¿Qué pasa si se va mientras se hace la carga inicial de datos?
POSIBLES SOLUCIONES
• Usar transacciones:
• db.beginTransaction()
• db.setTransactionSuccessful()
• db.endTransaction()
POSIBLES SOLUCIONES
• Adaptar la API:
• Crear tombstones.
• Poner timestamps que reflejen actividad.
• Crear tablas que reflejen cambios.
PERSISTENCIA + LOADERS = WIN
• Con Loaders puedes decir “quiero cargar fotógrafos”:
• El Loader resolverá si con lo que le has enviado quieres cargar locales u online.
• Puede hacer mezcla de ambos (primero descarga, luego carga de BD).
• Transparente a la Activity o Fragment que haga de presentador.
GRACIAS ESPECIALES A:Germán Ruiz, gran persona, mejor cliente (¡y fotógrafo!).