2011-06-26 19 views
8

que actualmente tiene un ListView con un adaptador personalizado que obtiene información que describe el contenido de las filas de forma asíncrona. Parte de cada fila es una URL de imagen, que planeo descargar de forma asincrónica y luego mostrar.ListView estrategia de carga asíncrona imagen

Mi plan actual de una estrategia para descargar estas imágenes es:

  • Mantener un caché de referencias a objetos de mapa de bits blandos descargados.
  • Cuando un getView() es llamado y el mapa de bits está en la caché, defina el mapa de bits para el ImageView directamente.
  • Si el mapa de bits no está en la caché, comenzará a cargar en un hilo separado, después de la descarga se ha completado añadir a la caché y llamar notifyDataSetChanged() en el adaptador.

También estoy planeando matar descargas pendientes cuando el objeto Actividad poseer OnDestroy del ListView() - Método (o posiblemente incluso en el onPause() - Método) se llama, pero lo más importante que quiero matar a la descarga de imágenes pendientes cuando la fila desaparece de la pantalla. De hecho, es posible que solo cancele la descarga después de un breve retraso, por lo que puede reanudarse sin perder ancho de banda si la fila vuelve a aparecer en pantalla rápidamente.

Yo, sin embargo, estoy seguro de algunas cosas:

  • ¿Cuál es la mejor manera de detectar cuando una fila va fuera de la pantalla para que pueda cancelar la descarga?
  • está llamando notifyDataSetChanged() lo mejor que puede hacer después de la descarga se ha completado o hay una mejor manera?

También agradeceríamos cualquier comentario sobre la estrategia completa.

Respuesta

8

No creo que llamar notifyDataSetChanged() que realmente se necesita ... yo lo haría así:

  • URL del almacén como etiqueta en la vista cuando creado/modificado
  • registra un detector de hilo de descarga (tarea asíncrona ???) para descargar manteniendo referencia a la vista y la dirección URL
  • cada vez que la imagen se descarga de forma asincrónica , Reviso TAG en el ver y si coincide - actualizaría el ImageView (importante para hacerlo en el subproceso de interfaz de usuario, pero cuando se utiliza la tarea asincrónica, se da). La imagen también se debe almacenar en la tarjeta SD (y cada vez que solicite una URL, debe verificar si aún no se ha descargado).
  • cada vez que getView() vuelve a utilizar la vista (vista pasado no está vacío) Me gustaría comprobar la etiqueta (dirección de edad), sustituirla por la nueva URL y cancelar la descarga de la OLDURL.

creo que sería más o menos que (algunos casos extremos puede suceder) ...

+0

Un caso de esquina en el que pensé es que una fila podría salir de la pantalla y nunca volver a usarse. Entonces nunca tendría la oportunidad de cancelar la descarga. – JPvdMerwe

+0

bastante improbable. Las vistas son reutilizadas de manera bastante rigurosa por ListView ... Podría ser simplemente "ligeramente fuera de la pantalla" (las vistas no se reutilizan inmediatamente cuando se mueven 1 píxel detrás de la pantalla), pero esto en realidad podría hacerte "corto". retrasar el "comportamiento de forma gratuita". –

0

me encontré con el mando a distancia de recursos gestión/ir a buscar en el código fuente Foursquared a ser bastante útil:

http://code.google.com/p/foursquared/source/browse/main/src/com/joelapenna/foursquared/util/RemoteResourceManager.java

almacena en caché las imágenes en el disco y se encarga de todos los 3 de sus peticiones. Vea un adaptador para saber cómo usarlo.

En cuanto a la cancelación de una descarga cuando una fila se apaga la pantalla tendrá que manejar ese mismo

+0

Cancelación de la descarga es bastante fácil, pero necesito para detectarlo primero y yo No estoy seguro exactamente de cómo hacer eso. – JPvdMerwe

3

que utilizan las propiedades getFirstVisible y getLastVisible AdapterView para detectar las filas visibles, y poner las solicitudes en una pila de tamaño fijo .

Mi proyecto es de código abierto y tiene una licencia más permisiva, si desea utilizarlo: https://github.com/tbiehn/Android-Adapter-Image-Loader

-Travis

Cuestiones relacionadas