Estoy usando a ListView
para mostrar algunas imágenes y subtítulos asociados con esas imágenes. Estoy recibiendo las imágenes de Internet. ¿Hay alguna manera de cargar imágenes de forma diferida para que mientras se muestre el texto, la IU no esté bloqueada y las imágenes se muestren a medida que se descargan?
El número total de imágenes no es fijo.
setUrl
.Respuestas:
Esto es lo que creé para contener las imágenes que mi aplicación muestra actualmente. Tenga en cuenta que el objeto "Log" en uso aquí es mi contenedor personalizado alrededor de la clase Log final dentro de Android.
fuente
LRU Cache
developer.android.com/training/displaying-bitmaps/…Hice una demostración simple de una lista perezosa (ubicada en GitHub) con imágenes.
Puede ser útil para alguien. Descarga imágenes en el hilo de fondo. Las imágenes se almacenan en caché en una tarjeta SD y en la memoria. La implementación de la memoria caché es muy simple y es suficiente para la demostración. Decodifico imágenes con inSampleSize para reducir el consumo de memoria. También trato de manejar las vistas recicladas correctamente.
fuente
Recomiendo el instrumento de código abierto Universal Image Loader . Originalmente se basa en el proyecto LazyList de Fedor Vlasov y se ha mejorado enormemente desde entonces.
fuente
Multithreading para rendimiento , un tutorial de Gilles Debunne.
Esto es del Blog de desarrolladores de Android. El código sugerido usa:
AsyncTasks
.FIFO cache
.garbage collect
caché usar.Drawable
mientras descargas.fuente
Actualización: Tenga en cuenta que esta respuesta es bastante ineficaz ahora. El recolector de basura actúa agresivamente en SoftReference y WeakReference, por lo que este código NO es adecuado para nuevas aplicaciones. (En su lugar, pruebe bibliotecas como Universal Image Loader sugerido en otras respuestas).
Gracias a James por el código y a Bao-Long por la sugerencia de usar SoftReference. Implementé los cambios de SoftReference en el código de James. Desafortunadamente, SoftReferences hizo que mis imágenes se recogieran demasiado rápido. En mi caso, estaba bien sin las cosas de SoftReference, porque el tamaño de mi lista es limitado y mis imágenes son pequeñas.
Hay una discusión de hace un año con respecto a las SoftReferences en los grupos de Google: enlace al hilo . Como solución a la recolección de basura demasiado temprana, sugieren la posibilidad de configurar manualmente el tamaño de almacenamiento dinámico de VM usando dalvik.system.VMRuntime.setMinimumHeapSize (), lo cual no es muy atractivo para mí.
fuente
Picasso
Utilice la biblioteca Picasso de Jake Wharton. (Una biblioteca perfecta de ImageLoading del desarrollador de ActionBarSherlock)
Una potente biblioteca de descarga y almacenamiento en caché de imágenes para Android.
Las imágenes agregan un contexto muy necesario y un toque visual a las aplicaciones de Android. Picasso permite la carga de imágenes sin problemas en su aplicación, ¡a menudo en una línea de código!
Picasso maneja automáticamente muchas trampas comunes de carga de imágenes en Android:
Manejo del reciclaje de ImageView y cancelación de descarga en un adaptador. Transformaciones de imagen complejas con un uso mínimo de memoria. Memoria automática y almacenamiento en caché de disco.
Biblioteca de Picasso Jake Wharton
Deslizamiento
Glide es un marco de administración de medios de código abierto rápido y eficiente para Android que envuelve la decodificación de medios, el almacenamiento en caché de memoria y disco, y la agrupación de recursos en una interfaz simple y fácil de usar.
Glide admite la obtención, decodificación y visualización de imágenes fijas de video, imágenes y GIF animados. Glide incluye una API flexible que permite a los desarrolladores conectarse a casi cualquier pila de red. De forma predeterminada, Glide utiliza una pila basada en HttpUrlConnection personalizada, pero también incluye bibliotecas de utilidades conectadas al proyecto Volley de Google o la biblioteca OkHttp de Square.
El enfoque principal de Glide es hacer que el desplazamiento de cualquier tipo de lista de imágenes sea lo más suave y rápido posible, pero Glide también es efectivo para casi cualquier caso en el que necesite buscar, cambiar el tamaño y mostrar una imagen remota.
Biblioteca de carga de imágenes Glide
Fresco de Facebook
Fresco es un poderoso sistema para mostrar imágenes en aplicaciones de Android.
Fresco se encarga de la carga y visualización de imágenes, para que no tenga que hacerlo. Cargará imágenes de la red, el almacenamiento local o los recursos locales, y mostrará un marcador de posición hasta que llegue la imagen. Tiene dos niveles de caché; uno en memoria y otro en almacenamiento interno.
Fresco Github
En Android 4.xy versiones anteriores, Fresco coloca imágenes en una región especial de la memoria de Android. Esto permite que su aplicación se ejecute más rápido y sufra el temido OutOfMemoryError con mucha menos frecuencia.
Documentación del fresco
fuente
Cargador de alto rendimiento: después de examinar los métodos sugeridos aquí, utilicé la solución de Ben con algunos cambios:
Me di cuenta de que trabajar con drawables es más rápido que con mapas de bits, así que en su lugar uso drawables
El uso de SoftReference es excelente, pero hace que la imagen en caché se elimine con demasiada frecuencia, por lo que agregué una lista vinculada que contiene referencias de imágenes, evitando que la imagen se elimine, hasta que alcanzó un tamaño predefinido
Para abrir InputStream, utilicé java.net.URLConnection, que me permite usar el caché web (primero debe configurar un caché de respuesta, pero esa es otra historia)
Mi código:
fuente
import java.util.Map; import java.util.HashMap; import java.util.LinkedList; import java.util.Collections; import java.util.WeakHashMap; import java.lang.ref.SoftReference; import java.util.concurrent.Executors; import java.util.concurrent.ExecutorService; import android.graphics.drawable.Drawable; import android.widget.ImageView; import android.os.Handler; import android.os.Message; import java.io.InputStream; import java.net.MalformedURLException; import java.io.IOException; import java.net.URL; import java.net.URLConnection;
He seguido esta capacitación en Android y creo que hace un excelente trabajo al descargar imágenes sin bloquear la interfaz de usuario principal. También maneja el almacenamiento en caché y el desplazamiento por muchas imágenes: carga de mapas de bits grandes de manera eficiente
fuente
1. Picasso permite la carga de imágenes sin problemas en su aplicación, ¡a menudo en una línea de código!
Utiliza Gradle:
¡Solo una línea de código!
2. Glide Una biblioteca de carga y almacenamiento en caché de imágenes para Android centrada en el desplazamiento suave
Utiliza Gradle:
// Para una vista simple:
3. fresco es un poderoso sistema para mostrar imágenes en aplicaciones de Android . Fresco se encarga de cargar y mostrar imágenes, para que no tenga que hacerlo.
Comenzando con Fresco
fuente
He escrito un tutorial que explica cómo hacer una carga lenta de imágenes en una vista de lista. Entro en algunos detalles sobre los temas de reciclaje y concurrencia. También uso un grupo de subprocesos fijos para evitar que se generen muchos subprocesos.
Carga lenta de imágenes en Listview Tutorial
fuente
La forma en que lo hago es iniciando un hilo para descargar las imágenes en segundo plano y entregarle una devolución de llamada para cada elemento de la lista. Cuando termina de descargar una imagen, llama a la devolución de llamada que actualiza la vista del elemento de la lista.
Sin embargo, este método no funciona muy bien cuando recicla vistas.
fuente
Solo quiero agregar un buen ejemplo más, Adaptadores XML . Como es utilizado por Google y también estoy usando la misma lógica para evitar un error OutOfMemory.
Básicamente, este ImageDownloader es su respuesta (ya que cubre la mayoría de sus requisitos). Algunos también se pueden implementar en eso.
fuente
Este es un problema común en Android que ha sido resuelto de muchas maneras por muchas personas. En mi opinión, la mejor solución que he visto es la biblioteca relativamente nueva llamada Picasso . Aquí están los aspectos más destacados:
Jake Wharton
de ActionBarSherlock fama.ListView
Detecciónfuente
He estado usando NetworkImageView de la nueva Biblioteca de Android Volley
com.android.volley.toolbox.NetworkImageView
, y parece estar funcionando bastante bien. Aparentemente, esta es la misma vista que se usa en Google Play y otras nuevas aplicaciones de Google. Definitivamente vale la pena echarle un vistazo.Tutorial de caché de imágenes de volley de Google I / O 2013
Desarrolladores de eventos de Google
fuente
Bueno, el tiempo de carga de imágenes desde Internet tiene muchas soluciones. También puede usar la biblioteca Android-Query . Te dará toda la actividad requerida. Asegúrese de lo que quiere hacer y lea la página wiki de la biblioteca. Y resuelva la restricción de carga de imágenes.
Este es mi código:
Debería resolver su problema de carga diferida.
fuente
Creo que este problema es muy popular entre los desarrolladores de Android, y hay muchas bibliotecas de este tipo que afirman resolver este problema, pero solo algunas de ellas parecen estar en la marca. AQuery es una de esas bibliotecas, pero es mejor que la mayoría de ellas en todos los aspectos y vale la pena intentarlo.
fuente
Debe probar este cargador universal es lo mejor. Estoy usando esto después de haber hecho muchos RnD en la carga diferida.
Cargador universal de imágenes
Caracteristicas
Soporte para Android 2.0+
fuente
Eche un vistazo a Shutterbug , el ligero puerto SDWebImage (una buena biblioteca en iOS) de Applidium para Android. Admite almacenamiento en caché asíncrono, almacena URL fallidas, maneja bien la concurrencia y se incluyen subclases útiles.
¡Las solicitudes de extracción (y los informes de errores) también son bienvenidas!
fuente
DroidParts tiene ImageFetcher que requiere cero configuración para comenzar.
Clone DroidPartsGram para un ejemplo:
fuente
Solo un consejo rápido para alguien que no está decidido con respecto a qué biblioteca usar para las imágenes de carga lenta:
Hay cuatro formas básicas.
Bricolaje => No es la mejor solución, pero para algunas imágenes y si quieres ir sin la molestia de usar otras bibliotecas
Volley's Lazy Loading library => De chicos de android. Es agradable y todo, pero está mal documentado y, por lo tanto, es un problema de uso.
Picasso: una solución simple que simplemente funciona, incluso puede especificar el tamaño exacto de la imagen que desea incorporar. Es muy simple de usar, pero puede que no sea muy "eficaz" para aplicaciones que tienen que lidiar con enormes cantidades de imágenes.
UIL: La mejor manera de cargar imágenes perezosas. Puede almacenar imágenes en caché (necesita permiso, por supuesto), inicializar el cargador una vez y luego hacer su trabajo. La biblioteca de carga de imágenes asíncronas más madura que he visto hasta ahora.
fuente
Novoda también tiene una gran biblioteca de carga de imágenes perezosas y muchas aplicaciones como Songkick, Podio, SecretDJ e ImageSearch usan su biblioteca.
Su biblioteca está alojada aquí en Github y también tienen un rastreador de problemas bastante activo . Su proyecto también parece ser bastante activo, con más de 300 confirmaciones al momento de escribir esta respuesta.
fuente
Mira mi tenedor de LazyList . Básicamente, mejoro LazyList retrasando la llamada de ImageView y creo dos métodos:
También mejoré el ImageLoader al implementar un singleton en este objeto.
fuente
Si desea mostrar el diseño Shimmer como Facebook, hay una biblioteca oficial de Facebook para eso. FaceBook Shimmer Android
Se encarga de todo, solo necesita poner el código de diseño deseado de manera anidada en un marco brillante. Aquí hay un código de muestra.
Y aquí está el código de Java para ello.
Agregue esta dependencia en su archivo gradle.
Así es como se ve.
fuente
Todos los códigos anteriores tienen su propio valor, pero con mi experiencia personal, solo pruebe con Picasso.
Picasso es una biblioteca específicamente para este propósito, de hecho administrará la memoria caché y todas las demás operaciones de red automáticamente. Tendrá que agregar una biblioteca en su proyecto y simplemente escribir una sola línea de código para cargar la imagen desde una URL remota.
Visite aquí: http://code.tutsplus.com/tutorials/android-sdk-working-with-picasso--cms-22149
fuente
Usa la biblioteca de planeo. Funcionó para mí y también funcionará para su código. Funciona tanto para imágenes como para gifs.
fuente
Puedo recomendar una forma diferente que funciona como un encanto: Android Query.
Puede descargar ese archivo JAR desde aquí
Como ejemplo:
Es muy rápido y preciso, y al usar esto puedes encontrar muchas más funciones como la animación al cargar, obtener un mapa de bits (si es necesario), etc.
fuente
Prueba Aquery . Tiene métodos sorprendentemente simples para cargar y almacenar en caché las imágenes de forma asincrónica.
fuente
URLImageViewHelper es una biblioteca increíble que te ayuda a hacer eso.
fuente
fuente
Tuve este problema e implementé lruCache. Creo que necesita la API 12 y superior o usar la biblioteca de compatibilidad v4. lurCache es una memoria rápida, pero también tiene un presupuesto, por lo que si le preocupa eso, puede usar un caché de disco ... Todo se describe en Caching Bitmaps .
Ahora proporcionaré mi implementación, que es un singleton al que llamo desde cualquier lugar como este:
Aquí está el código ideal para almacenar en caché y luego llamar a lo anterior en getView de un adaptador al recuperar la imagen web:
fuente