Pregunta

He revisado algunos puestos sobre la carga diferida, pero creo que mi problema es un poco diferente.

Tengo una galería (mi clase extiende Galería), que muestra 20 bastante grande en tamaño de las imágenes (400-500K cada uno). No puedo cargar a todos ellos a la galería desde consigo una excepción OutOfMemory.
Por lo tanto, he creado una serie de 20 dibujables e inicialmente poblaron los 9 primeros elementos (las imágenes provienen de la Web) y poner todo el resto a nulo. Mi intención era la siguiente: en una aventura hacia la derecha, el elemento traiga no. 10 y conjunto de elemento nulo no. 0. En otra arrojar al elemento de la derecha se ha podido recuperar ninguna. 11 y conjunto de elemento nulo no. 1 a nulo. Misma lógica en una aventura a la izquierda.

El problema es que puede lanzar mucho más rápido que los elementos se recuperan. Mi galería tiene un BaseAdapter y su getView () es como la siguiente:

public View getView(int position, View  convertView, ViewGroup  parent){
     ImageView imageView = new ImageView();
     imageView.setDrawable(imageArray[position];
     ....
     ....

     return imageView;
}

¿Cómo le digo getView () - si imageArray [posición] sigue siendo nula, muestran una "cargando ..." de diálogo y una vez que se repita el mismo conjunto con la misma posición
? Yo no quiero ver la imageView vacío y luego ajustado sobre la marcha. Quiero no ser capaz de ver el imageView en absoluto hasta que se establezca.

Gracias.

¿Fue útil?

Solución

Galería está diseñado para una experiencia sin problemas. Será muy mala interfaz de usuario si bloquea la pantalla y no cambia a la siguiente imagen hasta que se trae. Este usuario manera no será capaz de lanzar en absoluto. Usted debe mostrar algún indicador de carga en lugar de la imagen mientras se está cargando.

Creo que el escenario es bastante común. Debe descargar imágenes y mostrarlas. Si obtiene OutOfMemory se puede tratar de imágenes supersample extraño fuera del problema de memoria, mientras cargar una imagen a un objeto de mapa de bits .

Si todavía hay OutOfMemory debe quitar mapas de bits de la memoria caché y los de SD. Así que cuando aventuras usuario de vuelta puede cargar imágenes de SD de nuevo, será lo suficientemente rápido. Y el consumo de memoria será más baja. Como usted sugiere que puede tener 10 imágenes más recientes en caché en la memoria caché y otros en SD.

Se puede echar un vistazo a mi código de ejemplo Lazy carga de imágenes en ListView . En realidad se trata de un adaptador de ListView pero se puede aplicar a la galería, con modificaciones menores. Creo que va a hacer exactamente lo que necesita.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top