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.
- Problemas en la creación de varias tablas en sqlite
- Cómo reemplazar CursorAdapter bindView
- ¿Cómo puedo implementar mapas sin conexión usando osmdroid al guardar imágenes de mosaicos de mapa en la base de datos sqlite?
- Android: ListView con CheckBox, poblado desde la base de datos SQLite no funciona
- Cómo evitar objetos duplicados en la base de datos DB4o
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?
- Establecer el valor predeterminado de una columna de enteros SQLite
- No se pudo recuperar datos de la base de datos a listview.
- ¿Cómo crear un widget de Android con opciones?
- Excepción de la base de datos SQLite de Android - código 14 (no se puede abrir el archivo de base de datos)
- RealmObject AND Parcelable
- ¿Cómo puedo reiniciar la ID de incremento automático desde 1 en una base de datos SQLite de Android
- Compruebe si la consulta SQL ha tenido éxito en Android SQLite
- SQLite incapaz de abrir el archivo de base de datos (código 14) en la consulta "SELECT" frecuente
Hay varios aspectos a tener en cuenta aquí:
-
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. -
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.
-
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.
- LruCache
- DiskCache
- 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!