Acercamiento a las imágenes de Android en DB

Es una APP con una especie de contexto de galería. Uso de REST Estoy recibiendo (Volley) JSON que contiene información sobre el lugar y pocos enlaces a las imágenes. Porque hay alrededor de 60 lugares, por lo que la forma de caché PICASSO no es suficiente. Los datos se almacenan en DB, así que mi idea era insertar una imagen en la base de datos como byte stream . Está hecho, pero de una manera no tan buena, se presenta a continuación. Código dentro de AsyncTask .

 @Override protected Bitmap doInBackground(Void... params) { try { return Picasso.with(context) .load(site.getImageURL()) .get(); } catch (IOException e) { e.printStackTrace(); } return null; } @Override protected void onPostExecute(Bitmap bitmap) { super.onPostExecute(bitmap); ByteArrayOutputStream stream = new ByteArrayOutputStream(); try { bitmap.compress(Bitmap.CompressFormat.JPEG, 100, stream); } catch (Exception e) { e.printStackTrace(); } site.setImageBytes(stream.toByteArray()); db.openForWrite(); db.updateSite(site.getId(), site); db.close(); } 

Mi pregunta es cómo hacerlo eficiente, ¿sabes mejor manera de hacer eso? Intenté onSuccess callback a Picasso para agregar la imagen al DB onSuccess , pero requiere la vista como un primer argumento.

Tal vez hay una buena manera de guardar imágenes en la tarjeta SD, y la sustitución de enlace HTTP con la ubicación de la imagen en la tarjeta SD.

¿O poner en caché la imagen directamente en el disco?

Hay varios aspectos a tener en cuenta aquí:

  1. onPostExecute ejecuta en el subproceso principal. No es un buen lugar para hacer E / S de disco. La interfaz de usuario se congelará de vez en cuando cuando se muestren imágenes.

  2. Los blobs de SqLite son más rápidos que los archivos de disco normales sólo para tamaños limitados ( Benchmark ). Por lo tanto, los archivos grandes se almacenan mejor en el disco.

  3. El uso de Picasso es aconsejable si desea almacenar en caché carga perezosa en las imágenes. El problema es que Picasso no permitirá utilizar fácilmente su "DB personalizado como una solución de caché". Utiliza una caché HTTP de propósito general. Por tanto, los archivos almacenados en caché pueden ser invalidados periódicamente y eliminados.

Si desea completamente personalizable HTTP y carga de imágenes, pruebe algo como Volley.

Le sugiero que vaya con el almacenamiento en caché, considere el uso de la biblioteca de Universal Image Loader por Sergey Tarasevich (GitHub)

Permite una gestión detallada de la caché para las imágenes descargadas, con muchas configuraciones

  • UsingFreqLimitedMemoryCache -> El bitmap menos utilizado se elimina cuando se excede el límite de tamaño de caché.
  • LRULimitedMemoryCache: -> El bitmap que se ha utilizado menos recientemente se elimina cuando se excede el límite de tamaño de caché.
  • FIFOLimitedMemoryCache: -> La regla FIFO se utiliza para la eliminación cuando se excede el límite de tamaño de caché.
  • LargestLimitedMemoryCache: -> El mapa de bits más grande se elimina cuando se excede el límite de tamaño de caché.
  • LimitedAgeMemoryCache:> El objeto en caché se elimina cuando su edad excede el valor definido.
  • WeakMemoryCache: -> Un caché de memoria con sólo referencias débiles a los mapas de bits.

Para almacenar en caché las imágenes en android hay cierto mecanismo.

  1. LruCache
  2. DiskCache
  3. Almacenar en DB

Si las imágenes no son grandes y no más (2-3 KB) y la colección de ellos no se supone que se amplió a continuación, puede guardarlos en db. Pero sería más difícil escribirlas, leerlas . Por otro lado, el usuario no podrá hacer nada con ellos.

De lo contrario, si desea permitir que el usuario para ampliar la colección de imágenes o las imágenes son bastante grandes debe almacenarlos en la tarjeta sd (caché de disco) .

Nota: – Se recomienda utilizar la biblioteca Glide con el mecanismo de caché de disco

Planeo

Considere la carencia de espacio y tratar esos casos apropiadamente.

Tal vez hay una buena manera de guardar imágenes en la tarjeta SD, y la sustitución de enlace HTTP con la ubicación de la imagen en la tarjeta SD.

¿O poner en caché la imagen directamente en el disco?

Eso es exactamente lo que haría. Mira la caché en SD si la imagen está presente, si es así, úsala, si no la descarga a la caché y úsela desde la memoria caché. Pero usted tendrá que cuidar de los TTL-s.

@Biju Parvathy respuesta está bien, pero desde el 27 de noviembre de la Universal Image Loader había detener el mantenimiento del proyecto. Puedes verlo en su página github

Creo que una alternativa realmente buena es usar la Biblioteca de Fresco . Es de Facebook y soporta caché de almacenamiento local y un montón de otras cosas. Algunas de las propiedades de la caché son:

Caché de mapas de bits

Caché de memoria codificada

Caché de disco

Uso de una caché de disco o dos

Es muy fácil de usar y el tiempo de descargar imágenes es muy rápido. También es compatible con la transmisión de imágenes JPEG progresivas a través de la red .

Como se puede ver, el "bitmap.compress (Bitmap.CompressFormat.JPEG, 100, secuencia);" Método acepta un flujo de salida para guardar el mapa de bits.

Simplemente use FileOutputStream y elija una ubicación para guardar la imagen.

Prueba fresco . ¡Es una biblioteca milagrosa de Facebook!

  • cómo importar. sqlite en la base de datos en sqlite en android
  • Android: actualizar la versión de la base de datos y agregar nueva tabla
  • SQL eliminar de una tabla + un jointable?
  • Un comportamiento extraño para reguelr sqlite operación en android
  • SQLite ExecSql no funciona desde el archivo
  • Cómo almacenar el objeto JSON en la base de datos SQLite
  • Conexión de SQLite se filtró aunque todo se cerró
  • Bucle a través de un Cursor SQLite lleva demasiado tiempo
  • Seguridad de base de datos Sqlite
  • Base de datos LocalStorage vs Sqlite
  • ¿Cuándo cerrar la conexión db en android? Cada vez que finaliza tu operación o después de salir de la aplicación
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.